问题描述:
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里面我的“彩虹括号”,可是异常的好用啊,颜色漂亮、醒目,极大的提升了我作为程序员的幸福感,怎么会忘掉括号呢,^_^~~