蓝桥杯java最小公倍数_“1-n的最小公倍数问题”蓝桥杯 | 学步园

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

/************************************************************************/

/* 原理:

找出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

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");

}

以下是java实现(递归),条理会更清楚些:

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 list = new ArrayList();

public void getFactor(List list,int index){

if(index>N) {

calculate();

return;

}

int temp = index;

for(int i=1;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

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);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值