1. 公倍数
为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。
但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多。
事实上,它是1至6的每个数字的倍数。即1,2,3,4,5,6都是可以除尽60。
我们希望寻找到能除尽1至n的的每个数字的最小整数。
不要小看这个数字,它可能十分大,比如n=100, 则该数为:
69720375229712477164533808935312303556800
请编写程序,实现对用户输入的n (n<100)求出1~n的最小公倍数。
例如:
用户输入:
6
程序输出:
60
用户输入:
10
程序输出:
2520
要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
原题是C的题目,找了些资料是实现如下(同时我也用java实现了,原理有细微差别):
#include<stdio.h> /************************************************************************/ /* 原理: 找出n个数中所有有效因子相乘得到结果(含大数处理) 有效因子:1.当某因子A出现,取其最高次幂(但结果不大于n)为有效因子A^x 2.把该因子A的所用倍数从这n个数中剔除(即不做任何处理) */ /************************************************************************/ void main(){ int sum[200]={1},sn=1,n; int perm[50]={0},pn=0; int i,j,k,h; scanf("%d",&n); for(k=2;k<=n;k++){ for(i=0;i<pn;i++){ if(k%perm[i]==0)//只出现过的因子,其倍数均不重复计入 break; } if(i==pn){ perm[pn]=k; pn++; j=k*k; while(j<=n)//当某因子出现,取其最高次幂(结果不大于n) j=j*k; h=0; j = j/k ; for(i=0 ; i < sn ; i++){//大数处理 sum[i] = sum[i] * j + h; h = sum[i]/10000 ; sum[i] = sum[i]%10000 ; } if(h){ sum[sn] = h ; sn++; } } } for(i=sn-1;i>=0 ;i--){ printf("%d",sum[i]); } printf("\n"); }
package c_coding; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class CommonMultiple { int N = 100; static List<Integer> list = new ArrayList<Integer>(); public void getFactor(List<Integer> list,int index){ if(index>N) { calculate(); return; } int temp = index; for(int i=1;i<list.size();i++) { int factor = list.get(i); if(temp%factor==0) temp = temp/factor; } list.add(temp); getFactor(list,index+1); } public void calculate(){ BigInteger num = BigInteger.valueOf(1); for(int i=0;i<list.size();i++) { num = num.multiply(BigInteger.valueOf(list.get(i))); } list.clear(); System.out.println(num); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); CommonMultiple test = new CommonMultiple(); while(true){ System.out.println("用戶輸入:"); test.N = scanner.nextInt(); System.out.println("程序輸出:"); test.getFactor(list, 1); } } }