练习:(重点在图片注释)
1. 打印菱形
题目:
用C语言在屏幕上输出以下图案:
实现代码:
//打印菱形 //上半部分:空格在减少,*号在增多 #include <stdio.h> int main() { int line = 0;//上半行数 scanf("%d", &line);//输入上半行数 //菱形上半部分的打印:行数 -- line int i = 0; for (i = 0; i < line; i++) { //打印一行,先打印空格,再打印*号 //打印空格: int j = 0; //上半部分空格规律: // line-1-i:假设行数是7, //第一行打印7-1-0=6个空格;第二行打印7-1-1=5个空格…… for (j = 0; j < line-1-i; j++) { printf(" "); } //打印*号: //上半部分*号规律: // 2*i+1:假设行数是7, //第一行打印2*0+1个*号;第二行打印2*1+1个*号…… for (j = 0; j < 2*i+1; j++) { printf("*"); } //打印完后进行换行: printf("\n"); } //菱形下半部分的打印:行数 -- line-1 for (i = 0; i < line-1; i++) { //打印一行,先打印空格,再打印*号 //打印空格: int j = 0; //下半部分空格规律: // j<=i:假设行数是7-1=6, //第一行打印j=0,i=0,j<=i,1个空格;第二行打印j=0,i=1,j<=i,2个空格…… for (j = 0; j <= i; j++) { printf(" "); } //打印*号: //下半部分*号规律: // 2*(line-1-i)-1:假设行数是7-1=6, //第一行打印2*(7-1-0)-1,11个*号;第二行打印2*(7-1-1)-1,9个*号…… for (j = 0; j < 2*(line-1-i)-1; j++) { printf("*"); } //打印完后进行换行: printf("\n"); } return 0; }
测试图片:
菱形上半部分:
菱形下半部分:
2. 打印0-100000中的自幂数(水仙花数是其中一种)
题目:
求出0~100000之间的所有自幂数并输出。
自幂数是指一个n位数,其各位数字的n次方之和恰好等于该数本身,
如:153=1^3+5^3+3^3,则153是一个自幂数。
实现代码:
//打印自幂数(0-100000): //假设 m 是一个 n位数 ,m 的 每一位的n次方之和 等于 m。 //如-- 153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3 #include <stdio.h> #include <math.h> int main() { int i = 0; for (i = 0; i <= 100000; i++) //使用for循环产生0-100000的数 { //判断i是否是自幂数: //1. 知道是几位数:计算i的位数 -- n //一个数 至少也是 一位数,所以起始 n=1 int n = 1; int tmp = i;//代替i,防止后续操作改变循环变量 //思路:i/10 --> 可以去掉一位 --> n+1 ,直到i/10==0 while (tmp /= 10) //直到/10==0,停止循环 { n++;//统计位数 } //2. 求每一位的n次方之和 //思路:%10 --> 取出每一位 tmp = i;//再次替换i int sum = 0;//存放每位次方后的和 while (tmp)//只要i不等于0,就继续取出每一位 { sum += pow(tmp % 10, n); //模10 取出一位后,求出这位数的n次方,再求和 tmp /= 10;//移至下一位 } //3. 判断是不是自幂数 if (sum == i) { printf("%d ", i);//是则进行打印 } } return 0; }
测试图片:
3. 求Sn=a+aa+aaa+aaaa+aaaaa+……的前n项之和
题目:
求Sn=a+aa+aaa+aaaa+aaaaa+……的前n项之和,其中a是一个数字,
例如:2+22+222+2222+22222+……
实现代码:
//计算求和 //求Sn = a + aa + aaa + aaaa + aaaaa的前n项之和,其中a是一个数字, //例如:2 + 22 + 222 + 2222 + 22222 #include <stdio.h> int main() { int a = 0; int n = 0;//a的前n项 scanf("%d %d", &a, &n); //规律:a + a*10+a + …… //利用规律算出每一项后相加 int i = 0; int sum = 0;//算出每一项后相加 int k = 0;//用于算出每一项 for (i = 0; i < n; i++)//前n项,算n次 { k = k * 10 + a;//利用规律算出每一项 sum += k;//每一项相加 } //输出结果: printf("%d\n", sum); return 0; }
测试图片:
4. 喝汽水问题
题目:
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)
第一种方法 -- 实现代码:
//喝汽水问题 //喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。 #include <stdio.h> int main() { int money = 0; //空瓶数 int total = 0; //喝的全部瓶数 int empty = 0; //空瓶数 //输入钱数: scanf("%d", &money); total += money;//一开始,有多少钱就有多少瓶 empty += money;//钱换了多少瓶就有多少空瓶 //进行空瓶兑换: while (empty >= 2)//空瓶大于等于2瓶就进行兑换 { total += empty / 2;//把兑换后的瓶数加到总瓶数中 empty = empty / 2 + empty % 2; //empty / 2:换了多少瓶就又有多少个空瓶, //empty % 2:再加上可能没到2瓶不够换的1瓶 //这两部分加起来才是总空瓶数 //之后再判断需不需要再循环 } printf("%d", total); return 0; }
第一种方法 -- 测试图片:
第二种方法 -- 实现代码:
//喝汽水问题 //喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。 #include <stdio.h> int main() { int money = 0; //空瓶数 int total = 0; //喝的全部瓶数 int empty = 0; //空瓶数 //输入钱数: scanf("%d", &money); total += money;//一开始,有多少钱就有多少瓶 empty += money;//钱换了多少瓶就有多少空瓶 //利用方法一中发现的规律: if (money > 0) //防止0元计算出负一瓶的情况 { total = 2 * money - 1; //使用规律进行计算 } printf("%d", total); return 0; }
第二种方法 -- 测试图片: