`
java-mans
  • 浏览: 11392373 次
文章分类
社区版块
存档分类
最新评论

nyoj-517 求1-n的最小公倍数

 
阅读更多
清明节放假去玩了,回来后做的第一个题。表示很没有手感。明天上午蓝桥杯比赛、、、、怎么办呢 、、、
题意:
求1-n所有数的最小公倍数。n的范围是【1-100】
分析:
仔细观察会发现,【1-n】的最小公倍数,是【1-n-1】的最小公倍数乘以n的所有素因子中没有被【1-n-1】包含的素因子。

例如:【1-7】的最小公倍数是2*3*2*5*7,8=2*2*2,(8中2出现3次,【1-7】的素因子中只出现2次)那么【1-8】就是2*3*2*5*7*2

代码:

#include<iostream>
#include <math.h>
#include <stdio.h>
#include <string.h>
		using namespace std;
	int sum[100];//记录最小公倍数的所有素因子
	int num[101];//记录1-100的素数表
	char N[101][50];//记录最小公倍数
	int main()
	{
		int n;
		int i,j;
		memset(sum,0,sizeof(sum));
		memset(num,0,sizeof(num));
		memset(N,'\0',sizeof(N));
		for(i=2;i<11;i++)//打印素数表
		{
			if(num[i]==0)
				for(j=2*i;j<101;j+=i)
				{
					if(j%i==0)
						num[j]=1;
				}
		}
		N[1][0]='1';
		for(i=2;i<101;i++)//打印每个数的最小公倍数
		{
			int W=1;int w=i;
			for(j=2;j<=i&&w>1;j++)//找素因子
			{
				if(num[j]==0&&w%j==0)
				{
					int k=0;
					while(w%j==0)
					{
						w/=j;
						k++;
					}
					if(sum[j]<k) {W*=j;sum[j]++;}
				}
			}
			if(W>1)//计算i的最小公倍数
			{
				int flag=0;j=0;
				while(N[i-1][j]!='\0')
				{
					int x=(N[i-1][j]-'0')*W+flag;
					N[i][j]=x%10+'0';
					flag=x/10;
					j++;
				}
				while(flag)
				{
					N[i][j++]=flag%10+'0';
					flag/=10;
				}
			}
			else strcpy(N[i],N[i-1]);
		}
		while(cin>>n)
		{
			i=0;
			while(N[n][i]!='\0') i++;
			for(j=i-1;j>=0;j--)//倒序输出
				printf("%c",N[n][j]);
			printf("\n");
		}
		return 0;
	}
	



总结:
题其实很简单,一直没能投入,所以耽误了比较长的时间。考虑问题的时候,要全面的分析,例如这个题,完全可以考虑到1-100的最小公倍数肯定超出__int64.所以需要转化成字符串问题来解,其次,关于字符串的长度上调试了很长时间。这是由于没有正确对待报出的错误。Access Violation就是访问超内存了。要记住每次的错误在哪里。下次再出现同样问题,很快就会解决。警示!!!!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics