鱼C论坛

 找回密码
 立即注册
楼主: 欧拉计划

题目5:找出最小的能被1-20中每个数整除的数

[复制链接]
发表于 2020-8-24 13:27:11 | 显示全部楼层
  1. a = 2520
  2. flag = 1
  3. while flag:
  4.     a += 20
  5.     for b in range(11,21):
  6.         if a % b != 0 :
  7.             break
  8.         if b == 20:
  9.             flag = 0
  10. print(a)
复制代码

emmm/最直白方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 20:49:51 | 显示全部楼层
  1. from time import time

  2. def beishu(x,y):
  3.     if x > y:
  4.         x,y = y,x
  5.     for i in range(1,x*y):
  6.         if y*i%x==0:
  7.             return y*i

  8. t1 = time()
  9. n = int(input('请输入需要求的数字:'))
  10. m = n
  11. w =1
  12. for i in range(1,m):
  13.     w = beishu(w,i+1)
  14.    
  15. print('%d 是最小的能被 1-%d 中每个数字整除的正整数' % (w,m))

  16. t2 = time()
  17. t=t2-t1
  18. print('耗时为:%s' % t)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-1 17:30:24 | 显示全部楼层
本帖最后由 a315734685 于 2020-9-1 17:33 编辑

代码不难, 算好久都没算出来,
如果是1-10的话, 还是可以秒出的.
x = 1
while 1:
    for i in range(1, 21):
        if x % i != 0:
            break
    else:
        print(x)   # 听说Python独有的, 循环顺利结束才会执行的语句块.
        break
    x += 1

# 大概五分钟左右跑出来的结果 232792560  

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-1 21:21:16 | 显示全部楼层
a315734685 发表于 2020-9-1 17:30
代码不难, 算好久都没算出来,
如果是1-10的话, 还是可以秒出的.
x = 1

嘿嘿,其实 else 块在 C/C++ 中是可以用 goto 实现的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-2 16:07:01 | 显示全部楼层
  1. '''2520 是最小的能被 1-10 中每个数字整除的正整数。
  2. 最小的能被 1-20 中每个数整除的正整数是多少?'''

  3. def prime(num):
  4.     prime_seq = [3,5]
  5.     for factor in range(3,num):
  6.         check_prime = 0
  7.         if 3 > int(factor/2):
  8.             check_prime += 1
  9.             pass
  10.         else:
  11.             for prime in range(2,int(factor/2)):
  12.                 if factor%prime == 0:
  13.                     check_prime += 1
  14.                     break
  15.         if check_prime == 0:
  16.             prime_seq.append(factor)
  17.     global total
  18.     total = 1
  19.     for each in prime_seq:
  20.         total *= each

  21. def least_commonmultipler(num):
  22.     prime(num)
  23.     num = total
  24.     while True:
  25.         check = 0
  26.         for i in range(1,21):
  27.             if num%i != 0:
  28.                 check += 1
  29.                 num += total
  30.                 break
  31.         if check == 0:
  32.             print(num)
  33.             break

  34. start_least_common_multipler = time.time()
  35. least_commonmultipler(20)
  36. time_least_common_multipler = time.time() - start_least_common_multipler
  37. print("%f秒" %time_least_common_multipler)
复制代码



232792560
0.000496秒
改变least_commonmultipler后的参数可实现更大数字,速度奇快
原理就是吧范围内的质数找出后求积,再叠加求值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-2 16:09:05 | 显示全部楼层
有马_冬巳 发表于 2020-10-2 16:07
232792560
0.000496秒
改变least_commonmultipler后的参数可实现更大数字,速度奇快

亲测求10万的时间是14秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-4 09:45:30 | 显示全部楼层
  1. Range[20] // FactorInteger /@ # & // Flatten[#, 1] & //
  2.     DeleteDuplicates // GatherBy[#, First] & // Last /@ # & //
  3. Times @@ Apply[Power, #, {1}] &
  4. (*代码的思路就是算出1-20所有整数分解因子,去重,排序,分组,取最大幂,构造出最终结果*)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-4 23:32:17 | 显示全部楼层
适用更大的数应该。
import math as m
def is_prime(n):
    if n > 1:
        if n == 2 :
            return True
        if n % 2 == 0:
            return False
        for each in range(3, int (m.sqrt(n)+1), 2):
            if n % each == 0:
                return False
        return True
    return False

def get_prime(n):
    while 1:
        if is_prime(n):
            yield n
        n = n + 1

def solve():
    count = 2
    for i in get_prime(3):
        if i < 21:
            count *= i

        else:
            count1 = count
            print('prime', count)
            list1 = list(range(2,21))
            while 1:
                a = 1
                for x in list1:
                    if count % x != 0:
                        a = 0
                        break
                if a:
                    print(count)
                    break
                count = count + count1
            return

solve()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-6 13:40:41 | 显示全部楼层
牡丹花下死做鬼 发表于 2015-7-19 21:57
不习惯用python 还是C写的没怎么优化 大概一秒不到点出的答案 232792560

牛逼! 好想法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-26 15:28:10 | 显示全部楼层
  1. def numb_min(n):
  2.     list1 = list(range(1,n+1))
  3.     for i in range(n):
  4.         for j  in range(i+1,n):
  5.             if list1[j]% list1[i] == 0:
  6.                 list1[j] = int(list1[j]/list1[i])
  7.     m = 1
  8.     for k in list1:
  9.         m = m* k
  10.     return m
  11. print(numb_min(20))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-4 11:25:16 | 显示全部楼层
  1. #从质数往上推
  2. num=base=19*17*11*13*2*3*5*7
  3. lest=list(range(2,21))
  4. flag=1
  5. while 1:
  6.     for each in lest:
  7.         if num % each != 0:
  8.             flag=0
  9.             break
  10.     if flag:
  11.         print(num)
  12.         break
  13.     num+=base   
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-23 07:42:18 From FishC Mobile | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2021-8-27 11:11 编辑
  1. from math import lcm
  2. from functools import reduce
  3. print(reduce(lcm, range(1, 20 + 1)))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-9 00:15:42 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>

  3. int count = 0;

  4. int main1(void)//count = 648974546
  5. {
  6.         int i, result=1;
  7.         int limit = 20, flag;
  8.        
  9.         //printf("上限:");
  10.         //scanf("%d", &limit);
  11.        
  12.         while(1){
  13.                 for(i=1;i<=limit;i++)
  14.                 {
  15.                         count += 1;
  16.                         if(result%i != 0){
  17.                                 result += 1;
  18.                                 break;
  19.                         }
  20.                         if (i == limit){
  21.                                 flag = 1;
  22.                         }
  23.                 }
  24.                 if (result % limit == 0 && flag){
  25.                         break;
  26.                 }
  27.         }
  28.         printf("result = %d\n", result);
  29.         printf("count = %d\n", count);
  30.         return 0;
  31. }

  32. int is_prime(int value)
  33. {
  34.         int i;
  35.         for(i=2;i<=sqrt(value);i++)
  36.         {
  37.                 count += 1;
  38.                 if (i>3) i++;//step 1
  39.                 if (value % i == 0) return 0;
  40.         }
  41.         return 1;
  42. }

  43. int find_step(int value)// step 2
  44. {
  45.         int result = 1;
  46.         int i,j;
  47.         for(i=2;i<=value;i++)
  48.         {
  49.                 count += 1;
  50.                 if (is_prime(i)){
  51.                         result *= i;
  52.                 }
  53.         }
  54.         return result;
  55. }

  56. int is_multiply(int value, int limit)
  57. {
  58.         int i;
  59.         for(i=1;i<=limit;i++)
  60.         {
  61.                 count += 1;
  62.                 if (value%i!=0) return 0;
  63.         }
  64.         return 1;
  65. }

  66. int main(void) // count = 212
  67. {
  68.         int i = 1;
  69.         int limit = 20;
  70.         int step = find_step(limit);
  71.        
  72.         while(!is_multiply(step * i, limit)) i++;
  73.         printf("result = %d\n", step * i);
  74.         printf("count = %d\n", count);
  75. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-6 09:44:38 | 显示全部楼层
#include <iostream>
using namespace std;
int main()
{
        for(int i=20,j=0;;i++)
        {
         for(int i0=1;i0<=20;i0++)
         {
          if(i%i0!=0)
                 break;
          if(i0==20)
                {
                 cout<<i<<endl;
                  j=1;
            }
         }
         if(j==1)
            break;
        }
                return 0;
}
//我用C++写出来的答案:232792560
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-9 12:49:10 | 显示全部楼层
#1-20 中能被每个数整除的正整数(即最小公倍数)
'''
两个数的乘积 = 最大公约数 * 最小公倍数
'''

#求两个数最大公约数
def gcd(n1,n2):
    if n2 > 0:
        return gcd(n2, n1 % n2)
    else:
        return n1


#求两个数最小公倍数
def lcm(n1,n2):
    return n1 * n2 // gcd(n1, n2)


num = 20 #求1多少num就写多少
#将每次求得的最小公倍数作为n1再与下一个数求最小公倍数
a = lcm(1, 2)
for i in range(3, num+1):
    a = lcm(a, i)

print(a)
               
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-27 13:56:20 | 显示全部楼层
本帖最后由 番杰 于 2021-10-27 14:06 编辑
  1. #include<stdio.h>

  2. int mian(void)
  3. {
  4.         int flag = 0 ;
  5.         int result ;
  6.         for(int i = 2520 ;;i++)
  7.         {
  8.                 for(int j = 11;j < 21;j++)
  9.                 {
  10.                         if(i / j == 0)
  11.                         {
  12.                                 flag ++;
  13.                         }
  14.                         else
  15.                                 break;
  16.                 }
  17.                 if(flag  == 10)
  18.                 {
  19.                         result = i ;
  20.                         break;
  21.                 }
  22.         }
  23.        
  24.         printf("%d",result);
  25.        
  26.         return 0;
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-13 02:45:00 | 显示全部楼层
最小能被1-20 中每个数整除的正整数是232792560

i初始
  1. #include<stdio.h>

  2. int main(void)
  3. {
  4.         int i, k, j;
  5.         int count;
  6.         i = k = 2*3*5*7*11*13*17*19;
  7.        
  8.         while (1)
  9.         {
  10.                 count = 0;
  11.                 for (j = 1; j < 21; j++)
  12.                 {
  13.                         if (i % j == 0)
  14.                         {
  15.                                 count++;
  16.                         }
  17.                         else
  18.                         {
  19.                                 break;
  20.                         }
  21.                 }
  22.                 if (count == 20)
  23.                 {
  24.                         printf("最小能被1-20 中每个数整除的正整数是%d\n", i);
  25.                         break;
  26.                 }
  27.                 else
  28.                 {
  29.                         i = i + k;
  30.                 }
  31.         }
  32.         return 0;
  33. }
复制代码
化为2*3*5*7*11*13*17*19是抄的评论大神的,我自己写的是i初始化为21,循环i++;运行了2秒多。大神的方法只运行了0.2秒。快了十倍。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-2 11:46:23 | 显示全部楼层
暴力但平行编程,效果也不错。
  1. /*
  2. 答案:232792560
  3. 耗时:2.82237秒(单线程)
  4.       0.385815秒(八线程)
  5. */

  6. #include <iostream>
  7. #include <omp.h>
  8. using namespace std;

  9. const int nStep = 2000;
  10. const long long INF = 0x7fffffffffffffLL;

  11. inline bool chk(long long n)
  12. {
  13.   for (int i = 3; i < 20; ++i)
  14.   {
  15.     if ((n % i) != 0)
  16.       return false;
  17.   }
  18.   return true;
  19. }

  20. int main(void)
  21. {
  22.   double t = omp_get_wtime();
  23.   volatile long long N = 21;
  24.   volatile bool bContinue = true;
  25.   long long lResult = INF;
  26. #pragma omp parallel shared(N, bContinue) reduction(min:lResult)
  27.   while (bContinue)
  28.   {
  29.     long long k, lR;
  30. #pragma omp critical
  31.     {
  32.       lR = lResult;
  33.       k = N;
  34.       N += nStep;
  35.     }
  36.     for (int i = k; i < k + nStep; ++i)
  37.     {
  38.       if (chk(i))
  39.       {
  40.         if (i < lR)
  41.           lR = i;
  42.         break;
  43.       }
  44.     }
  45.     if (lR < lResult)
  46.     {
  47. #pragma omp critical
  48.       {
  49.         lResult = lR;
  50.         bContinue = false;
  51.       }
  52.     }
  53.   }
  54.   t = omp_get_wtime() - t;
  55.   cout << lResult << endl << t << endl;
  56.   return 0;
  57. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-28 15:03:51 | 显示全部楼层
  1. long long LGCD(long long x,long long y)
  2. {
  3.     if(y == 0)
  4.         return x;
  5.     return LGCD(y,x%y);
  6. }
  7. long long LLCM(long long x,long long y)
  8. {
  9.     return x*y/LGCD(x,y);
  10. }
  11. long long LCMS(long long tot,int i)
  12. {
  13.     if(i>1)
  14.         return LCMS(LLCM(tot,i),i-1);
  15.     return tot;
  16. }
  17. #include <stdio.h>
  18. int main()
  19. {
  20.     printf("%ld",LCMS(2,20));
  21. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-12 10:59:11 | 显示全部楼层
本帖最后由 mathtimes 于 2022-2-12 11:07 编辑
  1. from math import lcm
  2. i = 1
  3. for j in range(2,21):
  4.     i = lcm(i,j)
  5. print(i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 13:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表