算法竞赛入门经典(第二版)第二章习题

 

2-1水仙花数
#include
int main()
{
int a,b,c;
for(int n=100;n<1000;n++)
{
a=n%10; //个位
b=n%100/10;//十位
c=n/100; //百位

if(a*a*a+b*b*b+c*c*c==n)
{
printf("%d\n",n);
}
}
return 0;
}

 

2-2韩信点兵
#include
int main()
{
int a,b,c;
int flag=1;
while(scanf("%d%d%d",&a,&b,&c)==3)
{
for(int n=10;n<=100;n++)
{
if(n%3==a&&n%5==b&&n%7==c)
{
printf("Case %d: %d\n",flag,n) ;break;
}
if(n==100)
{
printf("no answer\n");
}
}
++flag; }
return 0;
}

 

2-3倒三角形
#include
int main()
{
int n,sum=0;
scanf("%d",&n);

for(;n>0;n=n-2)
{
int m=n;
int flag=sum;
while(flag--)
{
printf(" ");
}
for(;m>0;--m)
{
printf("#");
}
printf("\n");
sum++;
}
return 0;
}



2-4 子序列的和
#include
int main()
{
int n,m,num=1;
while((scanf("%d%d",&n,&m))==2)
{
if(m==n) break;
double sum=0;
for(;n<=m;n++)
{
float key=1.0/n/n;
sum+=key;
}
printf("Case %d: %.5lf\n",num,sum);
num++;
}
return 0;
}



2-5分数化小数
#include
int main()
{
int a,b,c,sum=1;
while((scanf("%d%d%d",&a,&b,&c))==3)
{
if(a==0&&b==0&&c==0) break;

else if(a<0||b<0||c<0||a>1e+6||b>1e+6||c>100)
{
continue;
}
else
{
printf("Case %d: %.*lf\n",sum,c,1.0*a/b);
//这里 %.*lf是特殊的输出符,可以用变量表示小数点后的尾数
}
sum++;
}
return 0;
}



2-6排列(思路:1:2:3可以说明假设用一个最小的三位数就可以表示出其他的二个数,然后就是最小的三位数是123,它的最大值是987/3得到329,还有就是判断是否每个数字只使用了一次)
#include
int main()
{
for(int n=123;n<330;n++)//最小的三位数是123,它的最大值是987/3得到329
{
int m=n*2;
int k=n*3;
if((n%10+n/10%10+n/100+m%10+m/10%10+m/100+k%10+k/10%10+k/100)==45)
printf("%d %d %d\n",n,m,k);
}
return 0;
}

 

如有错误,欢迎指正

你可能感兴趣的:(算法竞赛入门经典(第二版)第二章习题)