2520是最小的能够被1到10整除的正数。
最小的能够被1到20整除的正数是多少?
第一种方法需要用欧几里得算法,这个算法可以在欧几里得算法_百度百科 看了解一下。我的代码实现:
#include <stdio.h> int gcd(int a, int b){ return(b ? gcd(b, a % b) : a);//欧几里得算法的实现,这里的作用就是求a和b的最大公约数 } int main(){ int sum = 1, a; scanf("%d", &a);//这里我用的输入方式,求答案的话就输入20就可以了 for(int i = 1; i <= a; i++){ if(sum % i == 0) continue;//因为当前的数模i等于0了就不用去进行下面的操作了 sum *= i / gcd(sum, i);//求的数去乘以当前数i 然后去除以他们的最大公约数,因为最大公约数,乘以了两次,所以需要去除一次 //比如(2 * 8) / gcd(8, 2) = 8; 8模8等于0, 8 模 2也为0; } printf("%d\n", sum); return 0; }
第二种方法
对于小于10的数进行一下操作
1, 2^1, 3^1, 2^2, 5^1, 2^1 * 3^1, 7^1, 2^3, 3^2, 2^1, 2^1 * 5^1
观察发现如果这个数可以除以1-10 ,那这个数就只需要由质数的幂次小于等于10相乘就可以得到最小的可以除以1-10的数。代码实现如:
#include <stdio.h> #include <math.h> int main(){ int n; scanf("%d", &n); long long sum = 1; for(int i = 2; i <= n; i++){ if(sum % i){//如果模这个数为0说明就不需要这个数的幂次,也说明这个数不是质数 int s = 1; while(pow(i, s) <= n){//判断当前质数是否小于等于要求的最大值,也就是20 s++; } s--; sum *= pow(i, s); } } printf("%lld\n", sum); return 0; }
最终答案为 232792560