nyoj517 最小公倍数 (大数)

发布时间:2020-10-21 整理:编程之家
编程之家收集整理的这篇文章主要介绍了nyoj517 最小公倍数 (大数)编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随编程之家小编过来看看吧!

描述
为什么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;
		}
	}
 } 

总结

以上是编程之家为你收集整理的nyoj517 最小公倍数 (大数)全部内容,希望文章能够帮你解决nyoj517 最小公倍数 (大数)所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!