前言
今天主要学习了算法书的第二章(循环结构),并实操了几个小题。
一、水仙花数
输出100~999中的所有水仙花数。若3位数ABC满足ABC=A^3 + B^3 + C^3,则称其为水仙花数。例如153=1 ^3 + 5^3 + 3^3,所以153是水仙花数。
分析:逐个检查范围内的每个整数是否满足条件。主要练习对于/(除)和%(取余)的实际应用。
#include<stdio.h>
#include<math.h>
int main()
{
for(int i=100;i<1000;i++)
{
int n,k0,k1,k2;
n=i;
k0=n%10;//个位的数
k1=n/10%10;//十位的数
k2=n/100;//百位的数
if(n==pow(k0,3)+pow(k1,3)+pow(k2,3))
printf("%d\n",n);
}
return 0;
}
二、倒三角形
输入正整数n<=20,输出一个n层的倒三角形。例如,n=5时,输入及输出如下图所示:
分析:观察所要输出的倒三角形,发现我们只要控制每行的空格以及符号(*)的个数即可。
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int count=0;
int num= 2*n-1;
for(int i=0;i<n;i++)//控制倒三角的行数
{
if(count>0)//控制输出空格
{
for(int j=0;j<count;j++)
printf(" ");
}
if(num>0)//控制输出*
{
for(int k=0;k<num;k++)
printf("*");
printf("\n");
count++;//每行对应的空格个数
num-=2;//每次下一行*个数减少2
}
}
return 0;
}
三、分数化小数
输入整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b<=10^6,c<=100。
样例输入:
1 6 4
0 0 0
样例输出:
Case 1:0.1667
#include<stdio.h>
int main()
{
int a,b,c;
int count=0;
while(scanf("%d%d%d",&a,&b,&c)&&a&&b&&c)
{
count++;
printf("Case %d: %.*f",count,c,1.0*a/b);
}
return 0;
}
此解法略有问题,对于部分测试数据不能达到良好输出,仍需改进。具体问题举例如下:
今日Tips
1.几乎在所有的比赛平台上,int都是32位整数。在解题中注意中间结果溢出的情况。(改用long long)
2.不确定输入个数的情况下可以使用while(scanf("%d",&a))
。
3.读写数据的方式有重定向和fopen两种方法。