推荐!!!数论,打表实现
/*
E[i]表示欧拉函数,F[i]表示因子个数
思路:欧拉函数,随着因子的增大,会成递增趋势(并非严格递增),因子个数也会递增,但两个函数的递增趋势相差很大,所以可以使用打表来发现规律。程序打表后发现,30之后开始,结果都为10。
*/
#include <cstdio>
int ans[]={0,1,1,2,2,4,5,5,6,6,7,7,7,7,7,7,7,7,8,8,8,8,8,8,9,9,9,9,9,9,10};
int main()
{
//freopen("f://data.in","r",stdin);
int T,N;
scanf("%d",&T);
for(int cas=1;cas<=T;cas++)
{
scanf("%d",&N);
if(N<30)
printf("Case %d: %d\n",cas,ans[N]);
else
printf("Case %d: 10\n",cas);
}
return 0;
}
//打表程序
#include <cstdio>
#include <cstring>
const int nMax=100;
int E[nMax],F[nMax];
int gcd(int a,int b)
{
return a%b==0?b:gcd(b,a%b);
}
int main()
{
freopen("f://data.out","w",stdout);
memset(E,0,sizeof(E));
memset(F,0,sizeof(F));
for(int i=1;i<nMax;i++)
{
for(int j=1;j<=i;j++)
{
if(gcd(i,j)==1)
E[i]++;
if(i%j==0)
F[i]++;
}
}
for(int i=1;i<nMax;i++)
{
if(i%10==0)
printf("\n");
printf("%d ",E[i]);
}
printf("\n***************************************\n");
for(int i=1;i<nMax;i++)
{
if(i%10==0)
printf("\n");
printf("%d ",F[i]);
}
printf("\n***************************************\n");
for(int i=1;i<nMax;i++)
{
int ans=0;
for(int l=1;l<=i;l++)
for(int r=l;r<=i;r++)
{
int sum1=0,sum2=0;
for(int k=l;k<=r;k++)
{
sum1+=E[k];
sum2+=F[k];
}
if(sum1==sum2)
ans++;
}
printf("%d,",ans);
if(i%10==0)
printf("\n");
}
printf("\n***************************************\n");
return 0;
}