一入代码深似海,从此妹子是路人.
进过一段时间的学习和探讨,对C语言大家应该有了进一步认识和了解,所以今天继续为大家带来一些相对简单,但需要一些小逻辑的问题,那么直接进入主题吧.
(一)在屏幕上输出以下图案
*
***
*****
*******
*********
***********
*************
***********
*********
*******
*****
***
*
这种输出图形的问题,当然有一个简单的方法-.-,有人会不会想到直接使用printf函数来实现,因为只需要
printf("*\n***\n*****\n*******\n*********\n***********\n*************\n***********\n*********\n*******\n*****\n***\n*\n");
如果使用这种方法也太low了吧,有损我们高级计算机程序员的风度,所以得用我们程序员的方法来解决.上代码
int main(){
int i = 0;
int j = 0;
for (i = 1; i <= 7; i++){//观察图形,最长行的行数是7,所以以此为分界点
printf("*");
if (i>1){
for (j = i; j > 1; j--){//逻辑:*是以1,3,5,7,9这样基数增长的,那么,每一行比前一行多两个*,逻辑部分立马清晰
printf("**");
}
printf("\n");//换行条件的确定,确保每一行的*"管饱"
continue;
}
printf("\n");
}
for (i = 6; i > 0; i--){//同上,这里至于要倒置即可
printf("*");
if (i>1){
for (j = i; j > 1; j--){
printf("**");
}
printf("\n");
continue;
}
printf("\n");
}
system("pause");
return 0;
}
难点:
1)get到*增长的规律,发现是基数增长后,使用for循环简单实现即可
2)倒置时注意从多到少,逻辑并不难
(二)求出0~999之间的所有“水仙花数”并输出。
首先,什么是水仙花数呢?
在数论中,水仙花数(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。
所以要找到关键点:一个N位数,其各个位数上的数的N次方和等于该数。
0~999,有个位数的0~9,有两位数10~99,有三位数100~999,那么,分开讨论,逐个击破,答案自然而出:
int main(){
int i = 0;
int j = 0;
for (i = 0; i < 10; i++){
if (i == i){
printf("%d\n", i);
}
}
for (i = 10; i < 100; i++){
if (i == (pow((i / 10), 2) + pow((i % 10), 2))){
printf("%d\n", i);
}
}
for (i = 100; i < 1000; i++){
if (i == (pow((i / 100), 3) + pow(((i % 100) / 10), 3) + pow(((i % 100) % 10), 3))){
printf("%d\n", i);
}
}
system("pause");
return 0;
}
这里并没有对代码进行注释,想把其中单独一个拿出来解读,其他的也可以通过类似的逻辑解决:
if (i == (pow((i / 10), 2) + pow((i % 10), 2)))
就拿两位数判断条件来说:i/10,在编程中会得到一个整数,而不是某个小数,如13/10 == 1,而不是1.这样就得到了十位上的数.当然后面的i%10,13%10 == 3,这样得到的是个位上的数.三位数的逻辑判断条件与这个相似,这里不多做解释.
(三)求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,
例如:2 + 22 + 222 + 2222 + 22222
当刚看到这个问题时,大家会立马想到2 + 2*10+2 + 2*100+2*10+2+2*1000+2*100+2*10+2........
好像抓到了某些重要的东西:2*10^0+2*10^1+2*10^0+....
那么题目也就迎刃而解
int main(){
int i = 5;//因为aaaaa嘛,最多为五位数,所以这里是约束位数的条件
int j = 0;
int input = 0;
printf("请输入一个1~9的数字:");
scanf("%d", &input);//输入一个数,当然默认为前面说的1~9
printf("%d\n", input);
int sum = 0;
int num = 0;
while(i > 1){
for (j = 0; j < 5; j++){
sum = sum + (input*(pow(10, j)));//利用循环先把每一个几位数的值确定
printf("%d\n", sum);
num += sum;//通过num来垒加
i--;
}
}
printf("%d\n", num);
system("pause");
return 0;
}
这个程序其实不完美,因为如果输入的数不是1~9呢,这时系统应该报错,返回重新输入,这里先不做过多解释,下一章会详细说到这个问题.
难点:
1)找到循环的特征:10^i次方
2)循环每次只找出了几位数所对应的值,需要另外一个数对垒加进行记录.