清明节放假去玩了,回来后做的第一个题。表示很没有手感。明天上午蓝桥杯比赛、、、、怎么办呢 、、、
题意:
求1-n所有数的最小公倍数。n的范围是【1-100】
分析:
仔细观察会发现,【1-n】的最小公倍数,是【1-n-1】的最小公倍数乘以n的所有素因子中没有被【1-n-1】包含的素因子。
总结:
题其实很简单,一直没能投入,所以耽误了比较长的时间。考虑问题的时候,要全面的分析,例如这个题,完全可以考虑到1-100的最小公倍数肯定超出__int64.所以需要转化成字符串问题来解,其次,关于字符串的长度上调试了很长时间。这是由于没有正确对待报出的错误。Access Violation就是访问超内存了。要记住每次的错误在哪里。下次再出现同样问题,很快就会解决。警示!!!!
题意:
求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就是访问超内存了。要记住每次的错误在哪里。下次再出现同样问题,很快就会解决。警示!!!!