776667 发表于 2016-10-6 00:04:02

def euler(x):
    result = x
    while True:
      for i in range(1,x+1):
            if result%i:
                break
      else:
            return result
      result += x

if __name__ == '__main__':
    print(euler(20))

镜中人31 发表于 2016-10-6 21:07:04

s = 11* 13 * 17 * 19*2520
i = s
x = 1
while x:
    if i%s == 0:
      if i%16 == 0:
            print(i)
            x = 0
    i = i * 2

不到一秒得到答案···不过要进行相当的分析,其实分析到这个地步基本上就不需要计算机了···

jerryxjr1220 发表于 2016-10-10 14:44:56

232792560


def gcd(x,y):
        maxi = 1
        for i in range(2,min(x,y)+1):
                if x%i ==0 and y%i ==0 and maxi <i:
                        maxi = i
        return maxi

def lcm(a,b):
    return a*b//gcd(a,b)
   
n = 3
m = 2
while n<=20:
    m = lcm(m,n)
    n+=1
print(m)

梦想绘制者 发表于 2016-11-3 00:29:05

哎,写这个程序费了好久。
这个题目其实就是求1-20所有数的最小公倍数,将其转化为逐个求两项的最小公倍数问题。

# Python 3.5实现求解最小的能被1-20中每个数整除的正整数

def gcd(Num1,Num2):
    '''辗转相除法即欧几里德算法(Euclidean algorithm)
       用于求两个正整数之最大公因子的算法
    '''
    if Num1 < Num2:
      Num1, Num2 = Num2, Num1

    if Num1 == Num2:
      return Num2
    else:
      while True:
            r = Num1 % Num2
            if r == 0:
                return Num2
            else:
                Num1, Num2 = Num2, r


def lcm(Num1, Num2):
    '''求两个正整数之最小公倍数的算法'''
    result = Num1 * Num2 // gcd(Num1, Num2)
    return result


def smallestMultiple(start, end):
    Product = 1

    if end < start:
      start, end = end, start
    if (not isinstance(start, int)) or (not isinstance(end, int)):
          print('请输入两个正整数!')
    else:
      p = list(range(start, end + 1))      
      lenP = len(p)

      for i in range(lenP):
            n1 = Product
            n2 = p
            Product = lcm(n1, n2)
                           
    return Product


sM = smallestMultiple(1, 10)
print('最小的能被1-10中每个数整除的正整数为:%d'%sM)
sM = smallestMultiple(1, 20)
print('最小的能被1-20中每个数整除的正整数为:%d'%sM)

>>>
最小的能被1-10中每个数整除的正整数为:2520
最小的能被1-20中每个数整除的正整数为:232792560

tsembrace 发表于 2016-11-7 22:26:18

#找出能被1到20之间各个数整除的正整数
import math
import time

start=time.clock()
def isPrime(n):
    if n<2:
      return False
    elif n==2:
      return True
    else:
      s=int(math.sqrt(n))
      for i in range(2,s+1):
            if n%i==0:
                return False
      return True

def findMax(n):
    #找出1~n之间的各个质数,并求其乘积
    s=1
    for i in range(2,n+1):
      if isPrime(i):
            s=s*i
    lista=list(range(2,n+1))
    m=s
    #最终结果必定为前面质因数乘积的倍数
    #遍历列表,遇见不能整除的则加一次质数乘积
    #再重新遍历,直到都可以整除
    while True:
      a=1
      for x in lista:
            if m%x!=0: #不能整除,须加一次再进入到下次循环重新遍历
                a=0
                break
      if a==1:
            break
      m=m+s
    return m

print(findMax(20))
end=time.clock()
print("共耗时:"+str(end-start)+"秒!")
   
            

toBeNot 发表于 2016-11-9 11:06:19

public class SmallestMultiple
{
        public static void main(String[] args)
        {
                //能被11-20整除的数就必然能被1-10整除,且必须是偶数
               
                int num = 0;
                int flag = 0;
                while(flag != 10)
                {       
                        flag = 0;
                        num = num + 2;
                        for(int i = 11;i <= 20;i++)
                        {
                                if(num % i == 0)
                                        flag = flag + 1;
                                else
                                        break;
                        }       
                }
                System.out.println("能被1-20整除的最小整数为:" + num);
        }
}

lyciam 发表于 2016-11-18 00:39:17

折腾了好久,失败了几次,越写越复杂,再看看其他人的代码后,怎么可以这么简洁!!!还有欧几里德算法……
import math
import time
t = time.clock()

def isprime(n):
    if (n%2==0 and n!=2) or n==1: return False
    for x in range(3,int(math.sqrt(n))+1,2):
      if n%x==0 or n%5==0: return False
    else: return True

def euler05_2(count=10):
    """2520是最小能被1-10中每个数字整除的正整数,最小的能被1-20中每个数整除地正整数是多少"""
    from functools import reduce
    def findprimefactors(n): #得到一个数的质因数列表,如果 n 为质数则直接返回
      if n==1:return
      if n<1:return []
      primelist =
      iteritem = iter(primelist)
      item = next(iteritem)
      primefactors = []
      while True:
            if isprime(n) or n<3:
                primefactors.append(int(n))
                return primefactors
            elif n%item == 0:
                primefactors.append(item)
                n /= item
                continue
            try:
                item = next(iteritem)
            except:
                return primefactors
    def lcm(a,b): #得到任意两个正整数最小公倍数的质因数列表
      if type(a) is int:
            la = findprimefactors(a)
      elif type(a) is list:
            la = a
      lb = findprimefactors(b)
      temp = []
      for i in la[:]:
            if i in lb: temp.append(i); la.remove(i); lb.remove(i)
            else: temp.append(i); la.remove(i)
      if lb: temp.extend(lb)
      return temp

    # 得到从 1-count 的最小公倍数的质因数列表:
    allcm = []
    start = True
    for n in range(1,count):
      if start:
            allcm = lcm(n,n+1)
            start = False
      else:
            allcm.extend(lcm(allcm,n+1))

    # 把allcm的所有元素相乘:
    result = 1
    for n in allcm:
      result *= n   
    return result

t = time.clock()
print('answer:',euler05_2(20),'\n--time:',time.clock()-t)

写得实在是太长了点
answer:232792560
time: 0.0012959836349992165

芒果加黄桃 发表于 2017-1-7 00:48:28

# encoding:utf-8
from time import time
import math
'''

2520 是最小的能被 1-10 中每个数字整除的正整数。
最小的能被 1-20 中每个数整除的正整数是多少?
'''
# 拆分素数因子
def findPrimeFactors(n, l_pr):
    if isPrime(n):
      return
    sqr_n = int(math.sqrt(n)) + 1
    result = list()
    for pr in l_pr:
      if n % pr == 0:
            result.append(pr)
            result.extend(findPrimeFactors(int(n / pr),l_pr))
            break
      if pr > sqr_n:
            break
    return result

# 是否为素数
def isPrime(n):
    if not isinstance(n, int):
      print('输入有误!')
      return
    if n < 4:
      return True;
    if n % 2 == 0 or n % 3 == 0:
      return False

    for i in range(3, int(math.sqrt(n)) + 1, 2):
      if not n % i:
            return False
      
    return True
# 查找到2~N的素数   
def findPrimesToN(number):
    if number == 1:
      return
    elif number == 2:
      return
    else:
      l_pn =
      n = 3
      while max(l_pn) < number:
            n += 2
            ispm = True
            sqr_n = int(math.sqrt(n))
            for t in l_pn:
                if n % t == 0:
                  ispm = False
                  break
                if t > sqr_n:
                  break
            if ispm:
                l_pn.append(n)
               
      return l_pn


number = int(input('输入数值:'))
start = time()
result = 1
fac_dict = dict()
l_pr = findPrimesToN(int(math.sqrt(number))+1)
print(findPrimeFactors(25,l_pr))
for n in range(1, number+1):
    fac_list = findPrimeFactors(n, l_pr)
    fac_set = set(fac_list)
    for each in fac_set:
      num = fac_list.count(each)
      if not fac_dict.get(each) or fac_dict.get(each) < num:
            fac_dict = num
    #print(fac_dict)
for key in fac_dict.keys():
    result *= (key ** fac_dict.get(key))
print('能被1~~%d整除的最小整数是%d' % (number, result))
print('cost %.3f sec' % (time() - start))

渡风 发表于 2017-1-12 22:13:45

本帖最后由 渡风 于 2017-1-12 22:15 编辑

此代码使用matlab编程
Problem5所用时间为0.0016794秒
Problem5的答案为232792560
%题目5:找出最小的能被1-20中每个数整除的数
function Output=Problem5(Input)
tic
if nargin==0
    Input=20;
end
=Com_Prime_Rank(Input);%Rank1是素数列,Rank2是合数列
L1=length(Rank1);
L2=length(Rank2);
for ii=1:L2
    for jj=1:L1
      if mod(Rank2(ii),Rank1(jj))==0
            Rank2(ii)=Rank2(ii)/Rank1(jj);
      end
    end
end
for kk=1:L2-1
    temp=kk;
    for ll=temp+1:L2
      if mod(Rank2(ll),Rank2(temp))==0
            Rank2(ll)=Rank2(ll)/Rank2(temp);
      end
    end
end
Output=prod(Rank1)*prod(Rank2);
toc
disp('此代码使用matlab编程')
disp(['Problem5所用时间为',num2str(toc),'秒'])
disp(['Problem5的答案为',num2str(Output)])
end
%% 子程序
%输入一个数使其生成小于它素数列和合数列(包括自身)
function =Com_Prime_Rank(Input)
if nargin==0
    Input=20;
end
Rank1=2;
Rank2=0;
for ii=3:Input
   temp=ii;
   Judge=1;
   for jj=floor(sqrt(temp))+1:-1:2
         if mod(temp,jj)==0
             Judge=0;
             break
         end
   end
   if Judge==1
      Rank_Temp1=;
      Rank1=Rank_Temp1;
   else
      Rank_Temp2=;
      Rank2=Rank_Temp2;
   end
end
Output1=Rank1;
Output2=Rank2(2:end);
disp(Output2)
end

FlySelf 发表于 2017-2-2 13:51:20

'''
思路:
1、找出1-20中,每个数的质因数,并存放在列表中,如果列表中的数已经包含该数的质因数,则不再向列表中添加

2、从20开始每个数验证一次,想想就感觉非常耗时,还是不去实现了
'''

import time

def is_prime(number):
    '判断是否为质数'
    flag = True
    for i in range(2, number):
      if number % i == 0:
            flag = False
    return flag

def multiple_1(number):
    '思路1完成题目'
    multiple = 1
    list_prime =
    list_temp =
    for i in range(1, number + 1):
      temp = i
      j = 2
      while j <= temp:
            if temp % j == 0 and is_prime(j):
                list_temp.append(j)
                temp /= j
                j = 1
            j += 1
      for n in list_temp:
            if list_temp.count(n) > list_prime.count(n):
                for m in range(0, list_temp.count(n) - list_prime.count(n)):
                  list_prime.append(n)
      list_temp.clear()
      list_temp.append(1)
    for i in list_prime:
      multiple *= i
    return multiple

start = time.clock()
print(multiple_1(20))
end = time.clock()
print('程序按思路1执行了%fs。' %(end - start))

执行结果:
232792560
程序执行了0.000230s。

夜魔时生 发表于 2017-3-6 14:19:44

i=20
while True:
    for j in range(1,21):
      if i%j==0:
            continue
      else:
            break
    else:
      print(i)
      break
    i+=1
      

99592938 发表于 2017-3-14 15:32:17

先把所有质数挑出来2*3*5*7*11*13*17*19,然后循环检测
num=n=2*3*5*7*11*13*17*19
f=k=1
while k:
    for i in range(1,21):
      if num%i:
            f=0
            break
    if f:
      print(num)
      k=0
    f=1
    num+=n
当然笔算也能算出结果,把剩下的合数分解因素,若能以已有质数积求得,就忽略,若不能,则再添质数,得到答案2*3*5*7*11*13*17*19*2*2*2*3=232792560

99592938 发表于 2017-3-14 15:35:30

镜中人31 发表于 2016-10-6 21:07
不到一秒得到答案···不过要进行相当的分析,其实分析到这个地步基本上就不需要计算机了···

对,你再乘2就行了。
笔算也能算出结果,把质数都列出来,剩下的合数分解因素,若能以已有质数积求得,就忽略,若不能,则再添质数,最后全相乘,得到答案2*3*5*7*11*13*17*19*2*2*3*2=232792560

JonTargaryen 发表于 2017-3-27 10:42:35

#include <stdio.h>

int main(void)
{
    int multiple = 0;
    int i;
    _Bool flag = 0;

    while(!flag)
    {
      multiple += 3 * 5 * 7 * 11 * 13 * 17 * 19;

      for(i = 2; i < 21; i++)
      {
            if(multiple % i)
            {
                break;
            }
      }

      if(i > 20)
      {
            break;
      }
    }

    printf("%d\n", multiple);

    return 0;
}

JonTargaryen 发表于 2017-3-27 10:49:40

JonTargaryen 发表于 2017-3-27 10:42


def main():
    result = 0

    while True:
      result += 2 * 3 * 5 * 7 * 11 * 13 * 17 * 19
      for each in range(1, 21):
            if result % each:
                break

      if each == 20:
            break

    print(result)

if __name__ == "__main__":
    main()

Eagle.Tong 发表于 2017-4-16 21:29:22

#求能被1-20中每个数整除的最小正整数
#设a,b的最大公约数为(a,b),最大公倍数为
#则有 a*b = (a,b)*

import time


start = time.time()
def gcd(x,y):
    x,y = max(x,y),min(x,y)
    r = x%y
    if r == 0:
      return y
    else:
      return gcd(y,r)


n1 = 2*3//gcd(2,3)

for n2 in range(4,21):
    n1 = n1*n2//gcd(n1,n2)

print(n1)

end = time.time()

print(end-start)

结果:232792560
时间:0.0070035457611083984s

天之南 发表于 2017-4-30 21:34:56

#include<stdio.h>

int main()
{
        const int L = 20;
        int num = 1;
        int * arr = malloc(L * sizeof(int));
        for (int i = 0;i < L;i++)
        {
                arr = i + 1;
                for (int j = 0;j < i;j++)
                {
                        if (arr % arr == 0)
                        {
                                arr /= arr;
                        }
                }
                num *= arr;
        }
        printf("%d\n", num);
        free(arr);
        return 0;
}

铭记太阳 发表于 2017-5-4 16:39:09

答案是232792560

#include<stdio.h>
//20以内涉嫌重复的只有2,3,5,7,将其除掉即可
//2最多有5次:16,3最多有2次:9
int main(void)
{
        int i,num,rst=1;
       
        for(i=2;i<=20;++i)
        {
                num = i;
                if(num%2==0)
                        while(num%2==0)        num /= 2;
                if(num%3==0)
                        while(num%3==0)        num /= 3;
                if(num%5==0)
                        num /= 5;
                if(num%7==0)
                        num /= 7;
                rst = rst * num;
        }
       
        rst = rst * 16 * 9 * 5 * 7;
        //乘2^4=16,3^2=9,5,7
        printf("%d\n",rst);
        return 0;
}

soby1984 发表于 2017-5-6 22:23:28

#include<stdio.h>
int main()
{
        int x={0};
        int a,b;
       
        for(a=20;x==0;a++)
        {
       
                for(b=1;b<21;b++)
                {
                        if(a%b==0)
                        {
                               
                                x=a;
                        }
                        else
                        {
                               
                                break;
                        }       
                       
                }
       
        }
       
        printf("%d ",x);

        return 0;
}

求告知这种算法怎么修改能更快速和简单

格式化、 发表于 2017-6-7 15:38:48

public static void main(String[] args) {
//                5、2520是最小能被1-10每个数字整除的正整数。最小的能被1-20中每个数整除的正整数是多少?
                int i=20;
                while(!cmp(i)){
                        i++;
                }
                System.out.println(i);
        }
        public static boolean cmp(int num) {
                for(int i=2;i<21;i++){
                        if(num%i!=0){
                                return false;
                        }
                }
                return true;
        }感觉速度有点慢
页: 1 [2] 3 4 5 6
查看完整版本: 题目5:找出最小的能被1-20中每个数整除的数