文章目录
题目1:打印菱形
要求:输入行数line,打印出对应的菱形。
如图,为line=7的菱形图案(菱形的上半三角有7行)
思路:打印菱形,我们可以理解为每一行都先打印空格,再打印*,并推导出每一行需要打印对应的个数。我们可以这样观察这个13行的菱形:
上半菱形的规律(前7行):
根据上面的图可以推出菱形打印的规律
上半三角
1.观察每一行的*,第一行一个*,后面每一行的都比上面一行依次加2,第line行共有(2 * line-1)个 ,所以菱形最长长度为2 * line-1,除去*外的部分都是空格。
2.计算菱形每一行左边有多少个空格需要打印,第一行除去外有(2 * line -1)-1个空格,由于左右两边空格对称,所以左面共有line-1个空格,因为每一行空格都比上一行少一个,所以可以推导出每一行空格有line-i个。
3.因为每一行都要先打印空格,再打印*,所以需要用循环来实现。
代码如下:
#include <stdio.h>
int main()
{
int line = 0;
int i, j;
scanf("%d", &line);
//第一个for循环打印菱形上半三角,从第一行打印到第line行
for (i=1; i <= line; i++)
{
//打印空格,每一行*左边的空格有line-i个
for (j = 1; j <= line - i; j++)
{
printf(" ");
}
//打印*,每一行的*有2*i-1个
for (j = 1; j <= 2*i-1; j++)
{
printf("*");
}
printf("\n");
}
//第二个for循环打印下半三角,菱形一共有2*line-1行,下半打印从第i+1行-2*i-1行
for (i = line + 1; i <= 2 * line - 1;i++)
{
//打印空格,每一行*左边的空格数为依次为1,2,3,4,5……,可以用i-line得到
for (j = 1; j <= i - line; j++)
{
printf(" ");
}
//打印*
//*数为菱形最大长度减去*两边的空格数,(2line-1)-2(i-line)
for (j = 1; j <= 4*line - 2*i - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
题目2:打印水仙花数
要求:求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,
如 : 153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个“水仙花数”。
1643=1 ^ 4 + 6 ^ 4 +4 ^ 4 + 3 ^ 4,则1643也是“水仙花数”。
思路:
1.要得到1-100000的数,可以用for循环实现。
2,要得到此时这个n位数的n,可以将它一直除以10,直至结果为0,并用一个计数器来计算位数。
3.要计算各个位数的n次方,需要用到pow函数()。
注:传递整数参数给pow()函数时,它会根据参数类型自动选择执行整数指数运算或浮点数计算,保证结果的准确性。
使用该函数需要包含数学运算的头文件。
#include <math.h>
代码如下:
#include <stdio.h>
#include <math.h>
int main()
{
int i;
for (i = 0; i <= 100000; i++)
{
//因为我们后面在使用pow函数时也要用到i
//为了保证i的值不会被计算次数的循环改变,可以把i放在一个变量tmp里。
int tmp = i;
int count = 0; //用count来累计i的位数
int sum = 0;
while (tmp)
{
count++;//如果能进入循环,说明i肯定至少是个位数,count需要加1
tmp /= 10;//当tmp大于个位数时,个位数已经被统计过加1了
//所以需要除10得到高位数再进行判断。
}
tmp = i; //tmp的值经过上面的循环变成了0,需要再把i重新赋值给tmp
while (tmp)
{
sum += pow(tmp % 10,count); //依次将tmp的最低位数的n次方求出来,再用sum累加起来。
tmp /= 10; //用来得到tmp所有位数上的数
}
if (sum == i)
printf("%d ", i);
}
return 0;
}
最终就能得到满足条件的水仙花数,如图所示:
所有的知识不是刚学完就能够很好的使用的,需要我们不断地练习题目,不断地学习和理解题目的思维,日拱一卒,我们才能够慢慢的进步。