nyist 517 最小公倍数
-
为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多。事实上,它是1至6的每个数字的倍数。即1,2,3,4,5,6都是可以除尽60。
我们希望寻找到能除尽1至n的的每个数字的最小整数m.
- 输入
- 多组测试数据(少于500组)。
每行只有一个数n(1<=n<=100). - 输出
- 输出相应的m。
- 样例输入
-
2 3 4
- 样例输出
-
2 6 12
这题一看简单 其实不简单 是个大数问题
我们首先需要把我们要用的素数进行打表
然后将我们的最小公倍数进行打表处理,
由于我们的n最大只有100 而数据大于100 这样我们就要把我们1 -- 100 的数全部进行打表 后面进行查询输出就可以了 这样会省一些时间#include <stdio.h> #include <string.h> #include <math.h> int prime[105];//素数表 int a[105];//最小公倍数 int b[105][100]; void prime_judge(int prm[])//打素数表 { int i = 0; int j = 0; prime[1] = 0; for(i = 2; i < 106; i++) { for(j = i*i; j < 106; j+=i) prime[j] = 1; } int k = 1; } void judge() { int i = 1; int j = 0; int k = 2; for(i = 0; i < 106; i++) a[i] = 1; for(i = 2; i < 106;i++) { int x = i; for(j = i; j > 1;) { int t = 0; if(prime[j]==0) { if(x%j ==0) { while(x%j==0) { t++; x = x/j; } int w = 0; int wk = 0; for(w = 1 ; w < k; w++) if(a[w] == j) wk++; if((t - wk) ==0 || t < wk) a[k] *= 1; else a[k] *= pow(j,t-wk); } } j--; } k++; } } void print() { memset(b,0,sizeof(b)); int k =0; for(k = 1; k < 106; k++) b[k][1] = 1; int i = 1, j = 0; for(i = 1; i < 103; i++) { for(j = 1; j <= i; j++) { int w = 1; int t = 0; int t1 = 0; int www = 1; while(www < 100) { t1 = b[i][w]*a[j] +t; b[i][w] = ( t1) % 10; t = t1 / 10; w++; www++; } } } } int main() { int i = 0; prime_judge(prime); judge(); print(); int n; while(scanf("%d",&n) != EOF) { int flag = 0; for(i = 100; i > 0; i--) if(b[n][i] || flag) { printf("%d",b[n][i]); flag = 1; } printf("\n"); } return 0; }
yy_room

浙公网安备 33010602011771号