[日常练习] 7. 基于'*'阵打印、寻找水仙花数小题的C语言详解!

问题描述:

1.在屏幕上输出以下图案:
*
***
*****
*******
*********
***********
*************
***********
*********
*******
*****
***
*
2.求出0~999之间的所有“水仙花数”并输出。“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3?,则153是一个“水仙花数”。
在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数,其各个数之N次方和等于该数。
例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数:
153 = 1^3 + 5^3 + 3^3。
370 = 3^3 + 7^3 + 0^3。
371 = 3^3 + 7^3 + 1^3。
407 = 4^3 + 0^3 + 7^3。
3.求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222
4.编写一个程序,它从标准输入读取C源代码,并验证所有的花括号都正确的成对出现。


问题分析及源代码:

1. 打印'*'阵其实是一个很为常见的问题,关键就在于'*'的增减数量及换行,分为上下半区进行讨论。for循环走起来,打印'*'的数量就可以得到控制了,至于换行呢一个for循环打印完毕后就是换行的时候了,源代码及结果如下:

#include <stdio.h>

int main()
{
	int i = 0;
	int k = 0;
	for (i = 0; i <= 4; i++) {             //打印行数
		for (k = 0; k <= 2 * i; k++) {     //打印'*',由少到多进行打印,注意在此打印的每一行的'*'数目为1、3、5、7
			printf("*");
		}
		printf("\n");                      //上半部打印完毕后换行
	}
	for (i = 0; i <= 3; i++) {             //
		for (k = 0; k <= 6 - 2 * i; k++) { //打印'*',由多到少进行打印,注意在此打印的每一行的'*'数目比上一行均要少两个'*'
			printf("*");
		}
		printf("\n");
	}
	getchar();
	return 0;
}

打印结果也是符合我们预期的,经过适当的调参就可以进行多行打印了。现在来思考下,怎么进行多行的居中打印呢?要怎么进行呢?for循环走起来!拿起键盘,放纵的敲出了源代码!!!

#include <stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	int k = 0;
	for (i = 0; i <= 6; i++)
	{
		for (j = 0; j <= 5 - i; j++)
			printf(" ");
		for (k = 0; k <= 2 * i; k++)
			printf("*");
		printf("\n");
	}
	for (i = 0; i <= 5; i++)
	{
		for (j = 0; j <= i; j++)
			printf(" ");
		for (k = 0; k <= 10 - 2 * i; k++)
			printf("*");
		printf("\n");
	}
	getchar();
	return 0;
}

它的思想和我们居中杨辉三角的思路一致,for循环走起来!


2. 水仙花数,可谓是非常巧的一种数学现象了,当时首次遇到的时候我也很“努力”的手算了几个水仙花数,但是,计算量真的很大,还是让计算机暴力求解吧!首先它得是一个三位数,数的范围就是100~999,这肯定就是需要进行遍历其中的所有数字,依次判别其是否为“水仙花”数,那么就需要for循环走起来,初值为100,跳出条件999,步长为1,这个不难理解。在循环体内就需要写判断条件了,根据题意需要将三位数的百位、十位、个位均分离出来,依次保存进行判断。那么百位就是除100,十位的话将它转化为两位数,再除10能得到,个位就直接模10。如689,首先除100得到6,再让689减去百位乘以100就能得到二位数,再除10即可,模10得到个位数不再进行解释。源代码及结果如下:

​
#include <stdio.h>

int main()
{
	int i = 0;
	int Percentile = 0;
	int tenth = 0;
	int units = 0;
	for (i = 100; i < 1000; i++) {
		Percentile = i / 100;                  //获得百位的数字
		tenth = (i - Percentile *100) / 10;    //获得十位的数字
		units = i % 10;                        //获得个位的数字
		if(i== Percentile * Percentile*Percentile + tenth * tenth*tenth + units * units*units){
			printf("%d %d %d\n", Percentile, tenth, units);
			printf("水仙花数为:%d\n", i);
		}
	}
	getchar();
	return 0;
}

结果显而易见了,但我们在处理十位的时候就不是那么机智了,脑子里很快的反应了当前用到的方案,但是先模100再除100不就直接能够得到结果了么...还是对这个水仙花数这名字还是很好听的...


3.这个问题就不需要多讲了,我只先写出一个很low的思路。想法还有就是里面的一长串东西用循环代替就很棒了...时间有点干,等待实现!

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	printf("请输入1至9之间的正整数:");
	scanf("%d", &i);
	while ((i > 10 && i < -10)!=0) {
		printf("请重新输入:");
	}
	j = i + (i * 10 + i) + (i * 100 + i * 10 + i) + (i * 1000 + i * 100 + i * 10 + i) +
		(i * 10000 + i * 1000 + i * 100 + i * 10 + i);
	printf("%d\n", j);
	getchar();
	getchar();
	return 0;
}

结果可以手算验证啊~~~


4.这个问题是《C和指针》第二章编程练习第2题,EOF是文件结束的标志。Ctrl+Z就是输入EOF字符,也就是结束输入。没有Ctrl+Z就会一直在while里面,就没办法得到结果了。

#include<stdio.h>

int main()
{
	int i = 0;
	int count = 0;
	while ((i = getchar()) != EOF) {
		if (i == '{')
			count++;
		if (i == '}'&&count == 0) {
			printf("不匹配\n");
			return 0;
		}
		if (i == '}'&&count != 0) {
			count--;
		}
	}
	if (count == 0) {
		printf("匹配\n");
	}
	else {
		printf("不匹配\n");
	}
	getchar();
	return 0;
}

显然,这个判断还是很合理的。但是在我的VS2017里面我的“彩虹括号”,可是异常的好用啊,颜色漂亮、醒目,极大的提升了我作为程序员的幸福感,怎么会忘掉括号呢,^_^~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值