相关题目:蓝桥杯最小公倍数
题目描述
为什么 1 小时有 60 分钟,而不是 100 分钟呢?这是历史上的习惯导致。但也并非纯粹的偶然:60 是个优秀的数字,它的因子比较多。
事实上,它是 1 至 6 的每个数字的倍数。即 1,2,3,4,5,6 都是可以除尽 60。
我们希望寻找到能除尽 1 至
n
n
n 的的每个数字的最小整数。\n\n不要小看这个数字,它可能十分大,比如
n
n
n = 100, 则该数为:69720375229712477164533808935312303556800\n\n
输入描述
输入一个数字 n n n
输出描述
输出出 1 ~ n n n 的最小公倍数。
输入输出样例
示例
输入
6
输出
60
//参照上一篇博客内容,提取主要成分,可以写出下面的代码:
//最小公倍数 new
#include<iostream>
using namespace std;
int arr[50] = {0};
int num[101] = {0};
int main(){
int n;
cin>>n;
for(int i = 1;i<=n;++i){
num[i] = i;
}
for(int i = 2;i<=n;++i){
//对每个数分解,找到最小公因子
for(int j = 1;j<i;++j){
if(num[i]%num[j]==0){
num[i]/=num[j];
}
}
}
//得到最小公因子num[i]后,乘上去
arr[0] = 1;
for(int i = 1;i<=n;++i){
//对每一个乘数num[i]进行乘法计算
int c=0,s=0;
for(int j = 0;j<50;++j){
s = arr[j]*num[i]+c;
arr[j]=s%10;
c = s/10;
}
}
//计算完毕
//从后往前找,找到第一个非零的数
int i = 0;
for(i = 49;i>=0;--i){
if(arr[i]!=0){
break;
}
}
//输出
for(int j=i ;j>=0;--j){
cout<<arr[j];
}
return 0;
}
解题关键
按照自前向后的顺序分解公因子
比如:
1 2 3 4 5 6
从2开始分解没变化,3没变化,4变化为:
1 2 3 2 5 6(4能整除2则除以2,那2和4公倍数表示就是2*2(4/2的结果))
5没有变化,6变化为:
1 2 3 2 5 1(6可以被前面的2和3整除,被分解了)
整数的乘法,注意是大数!
采用数组进行存储,结合进位循环递推给出每一位数字的结果