为什么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的阶乘,想想不对,因为n为4,4的阶乘为24,而题意是找4以内的最小公倍数
是12,然后参考了一篇博客的一个思路,先把2-n之间的因子去掉,如n==6时,2,6,去除后为
2,1,然后在按照大数相乘那样做
参考思路来源http://blog.csdn.net/qq_32650831/article/details/51328910
代码:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
char a[102]={0},b[102][10000];
int k=2;
void js(int x)//大数乘法
{
int cx=0,cb=0,i,j,t[3],s[10000]={0};
cb=strlen(b[k]);
if (x/10==0)
{
t[0]=x;
cx=1;
}
else if (x/100==0)
{
t[0]=x/10;
t[1]=x%10;
cx=2;
}
else
{
t[0]=x/100;
t[1]=x/10%10;
t[2]=x%10;
cx=3;
}
for (i=0;i<cb;i++)
for (j=0;j<cx;j++)
{
s[i+j+1]+=(b[k][i]-'0')*t[j];
}
for (i=cb+cx-1;i>=0;i--)
{
if (s[i]>=10)
{
s[i-1]+=s[i]/10;
s[i]%=10;
}
}
i=0;
while (s[i]==0)
{
i++;
}
k++;
for (j=0;i<cx+cb;i++,j++)
{
b[k][j]=s[i]+'0';
}
b[k][j]='\0';
}
int main()
{
int n,j;
strcpy(b[2],"2");
for (i=2;i<101;i++)
{
a[i]=i;
}
for (i=2;i<101;i++)//将因子去除
for (j=i+1;j<101;j++)
{
if (a[j]%a[i]==0)
a[j]=a[j]/a[i];
}
for(i=3;i<101;i++)
{
js(a[i]);
}
while (cin>>n)
{
if (n==0)
cout<<1<<endl;
else if (n==1||n==2)
cout<<n<<endl;
else
{
cout<<b[n]<<endl;
}
}
}