循环练习:打印菱形和水仙花数



题目1:打印菱形

要求:输入行数line,打印出对应的菱形。

如图,为line=7的菱形图案(菱形的上半三角有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;
}

最终就能得到满足条件的水仙花数,如图所示:
在这里插入图片描述

所有的知识不是刚学完就能够很好的使用的,需要我们不断地练习题目,不断地学习和理解题目的思维,日拱一卒,我们才能够慢慢的进步。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值