学习日记 | C语言经典例题①(实例1-20)

©一颗斯特拉
【注】
1.标有❤️的是值得多做的题
2.II、III代表二刷、三刷题目

  1. 题目来源于C语言经典例题(菜鸟教程100例)

——1.30更新——

实例1:【for循环】

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

01程序分析:
第1次:可把由1、2、3、4组成的都列举出来,选择其中满足条件的。
02Bad Solution:

#include <stdio.h>
int main()
{
    int count,i,j,z;
    count=0;
    for(i=1;i<5;i++)
        for(j=1;j<5;j++)
            for(z=1;z<5;z++)
            {
                if(i!=j&&i!=z&&j!=z)
                    count++;
            }
    printf("%d\n",count);
    return 0;
}

【错误】
1.本解答只计数,没有显示相应结果。
03Correct Solution:

#include <stdio.h>
int main()
{
    int temp,i,j,z;
    temp=0;
    for(i=1;i<5;i++)
        for(j=1;j<5;j++)
            for(z=1;z<5;z++)
            {
                if(i!=j&&i!=z&&j!=z){
                    printf("%d%d%d\n",i,j,z);
                    temp++;
                }
            }
    printf("total number:%d\n",temp);
    return 0;
}

【运行结果】

123
124
132
134
142
143
213
214
231
234
241
243
312
314
321
324
341
342
412
413
421
423
431
432
total number:24

04题目总结:

  1. for循环的语法:
for(init;condition;increment)
{
statement(s);
}

本题的条件可<=4,也可为<5


实例2:【if...else if...else语句】

题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;
利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
20万到40万之间时,高于20万元的部分,可提成5%;
40万到60万之间时高于40万元的部分,可提成3%;
60万到100万之间时,高于60万元的部分,可提成1.5%;
高于100万元时,超过100万元的部分按1%提成。
从键盘输入当月利润I,求应发放奖金总数?

01程序分析:
第1次:利用数轴来分界、定位。奖金是一个累加的过程。
02Bad Solution:

#include <stdio.h>
int main()
{
    int l;
    printf("enter the profit(10 thousand):");
    scanf("%d",&l);
    if(l<=10)
        printf("The bonus is:%d*0.1",l);
    else if(l>10&&l<=20)
        printf("The bonus is:10*0.1+(l-10)*0.075");
    else if(l>20&&l<=40)
        printf("The bonus is:10*0.1+10*0.075+(l-20)*0.005");
    else if(l>40&&l<=60)
        printf("The bonus is:10*0.1+10*0.075+20*0.005+(l-40)*0.003");
    else if(l>60&&l<=100)
        printf("The bonus is:10*0.1+10*0.075+20*0.005+20*0.003+(l-60)*0.015");
    else
        printf("The bonus is:10*0.1+10*0.075+20*0.005+20*0.003+40*0.015+(l-100)*0.01");
    return 0;
}

【错误】
1.没有注意到单位是万元。
2.printf()里带了计算,无法得到结果。
3.涉及高位数的计算,把相关变量设置为长整型double
【缺陷】
1.没有注意到累加的效应,程序显得冗长。
2.if条件语句里的条件可以再简化。
03Correct Solution:

#include <stdio.h>
int main()
{
    double l;
    double bonus,bonus1,bonus2,bonus3,bonus4,bonus5;
    printf("当月利润:");
    scanf("%lf",&l);
    bonus1=100000*0.1;
    bonus2=bonus1+100000*0.075;
    bonus3=bonus2+200000*0.03;
    bonus4=bonus3+400000*0.015;
    if(l<=100000){
        bonus=l*0.1;}
    else if(l<=200000){
        bonus=bonus1+(l-100000)*0.075;}
    else if(l<=400000){
        bonus=bonus2+(l-200000)*0.05;}
    else if(l<=600000){
        bonus=bonus3+(l-400000)*0.03;}
    else if(l<=1000000){
        bonus5=bonus4+(l-600000)*0.015;}
    else {
        bonus=bonus5+(l-1000000)*0.01;}
    printf("提成为:bonus=%lf",bonus);
    return 0;
}

【运行结果】

当月利润:120000
提成为:bonus=11500.000000

04题目总结:
1.if...else if...else语句需注意:

  • 一个if后可跟一个或零个else,else必须在else if之后;一个if后可跟多个else if,else if必须在else之前。
  • 一旦某个else if匹配成功,其他的else if或else将不会被匹配。

实例3:【数论+循环】❤️II

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

01程序分析:
第1次:设该数为x。
1.则x+100=n^{2},x+100+168=m^{2}
2.可得m^{2}-n^{2}=(m-n)\times(m+n)=168。则m-nm+n要么都为偶数,要么一奇一偶。到底是那种情况呢?
3.设置m+n=i,m-n=j,则m=(i+j)/2,n=(i-j)/2, i>j。可看出m和n要么都是偶数,要么都是奇数,因为m和n是正整数。从而i和j都是大于等于2的偶数。
4.可得i*j=168,j\geq2,则i\leq168/2,从而1<i<168/2+1
5.将i的所有数字循环即可。
02Bad Solution:
暂无
03Correct Solution:

#include <stdio.h>
int main()
{
    int i,j,m,n,x;
    for(i=2;i<=168/2;i++)
        {
            if(168%i==0)
            {
                j=168/i;
                if(i>j&&i%2==0&&j%2==0)
                {
                    m=(i+j)/2;
                    n=(i-j)/2;
                    x=n*n-100;
                    printf("%d + 100 = %d * %d\n",x,n,n);
                    printf("%d + 100 + 168 = %d * %d\n",x,m,m);
                }
            }
        }
    return 0;
}

【运行结果】

-99 + 100 = 1 * 1
-99 + 100 + 168 = 13 * 13
21 + 100 = 11 * 11
21 + 100 + 168 = 17 * 17
261 + 100 = 19 * 19
261 + 100 + 168 = 23 * 23
1581 + 100 = 41 * 41
1581 + 100 + 168 = 43 * 43

04题目总结:
只要分析到位就能做出来。


——2.3更新——

实例4:【switch语句+判断闰年】

题目:输入某年某月某日,判断这一天是这一年的第几天?

01程序分析:
输入年月日,从1月1号开始算是第几天,需要考虑的是所给年份是否是闰年。如果是闰年,且输入月份大于3,应该再多加1天。
02Bad Solution:
暂无
03Correct Solution:

#include <stdio.h>
int main()
{
    int year,month,day,sum,leap;
    printf("请输入年、月、日,格式为:年,月,日(2020,2,2)\n");
    scanf("%d,%d,%d",&year,&month,&day);//
    switch(month)
    {
        case 1:sum=0;break;
        case 2:sum=31;break;
        case 3:sum=31+28;break;
        case 4:sum=31+28+31;break;
        case 5:sum=31+28+31+30;break;
        case 6:sum=31+28+31+30+31;break;
        case 7:sum=31+28+31+30+31+30;break;
        case 8:sum=31+28+31+30+31+30+31;break;
        case 9:sum=31+28+31+30+31+30+31+30;break;
        case 10:sum=31+28+31+30+31+30+31+30+31;break;
        case 11:sum=31+28+31+30+31+30+31+30+31+30;break;
        case 12:sum=31+28+31+30+31+30+31+30+31+30+31;break;
    }
    sum=sum+day;
    if(year%400==0||(year%4==0&&year%100!=0))//闰年:能被400整除,或能被4整除但不能被100整除
    {
        leap=1;
    }else{
        leap=0;
    }
    if(leap==1&&month>2){
        sum++;
    }
    printf("这是这一年的第%d天。\n",sum);
    return 0;
}

【运行结果】

请输入年、月、日,格式为:年,月,日(2020,2,2)
2020,2,2
这是这一年的第33天。

04题目总结:
1.switch语句允许测试一个变量等于多个值时的情况。每个值称为一个case,且被测试的变量会对每个switch case进行检查。

switch语法

2.判断任意年份是否为闰年,需要满足以下条件中的任意一个:
① 该年份能被 4 整除同时不能被 100 整除;
② 该年份能被400整除。


——2.6更新——

实例5:【排序】

题目:输入三个整数x,y,z,请把这三个数由小到大输出。

01程序分析:
第一次:这是一个简单的排序问题,之后更新一个专门关于排序算法的文章。
02Bad Solution:
暂无
03Correct Solution:
【方法一】

#include <stdio.h>
int main()
{
    int a,b,c,temp;
    printf("请输入3个整数:\n");
    scanf("%d%d%d",&a,&b,&c);
    if(a>b){
        temp=b;
        b=a;
        a=temp;
    }//如果a>b,交换a、b
    if(a>c){
        temp=a;
        a=c;
        c=temp;
    }//如果a>c,交换a、c
    if(b>c){
        temp=c;
        c=b;
        b=temp;
    }//如果b>c,交换b、c
    printf("从小到大排序为:%d%d%d",a,b,c);
}

【运行结果】

请输入3个整数:
3 2 1
从小到大排序为:1,2,3

【方法二】
04题目总结:
1.使用scanf需要注意的几点:
①在读取字符串时,只要遇到一个空格,scanf() 就会停止读取,所以 "this is test" 对 scanf() 来说是三个字符串。在用 %c 输入时,空格和"转义字符"均作为有效字符。
%d%d%d 是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab 键、回车键分隔。
如果使用 ,来分隔输入的 %d, 相应的输入时也需要添加 ,
【注】输入时, 前一定要紧跟在数字后面,数字与, 之间不能有空格。


——2.8更新——

实例6:【特殊输出】

题目:用*号输出字母C的图案。

01程序分析:
第一次:要采用循环分行输出。
02Bad Solution:

#include <stdio.h>
int main() {
    int i, j;
    for (i = 0;i < 4;i++) {
        for (j = i+1;j < 4;j++) {
            printf("   ");
        }
    printf("*\n");
    }
    for (i = 0;i < 4;i++) {
        for (j = 4 - i; j < 4; j++) {
            printf("   ");
        }
        printf("*\n");
    }
    return 0;
}

【缺陷】想复杂了,并没有很像C。


结果02

03Correct Solution:

#include <stdio.h>
int main() {
    int i, j;
    printf("****\n");
    printf("*\n");
    printf("*\n");
    printf("****\n");
    return 0;
}

【运行结果】

结果03

04题目总结:
暂无

实例8:【多重循环】

题目:输出9*9口诀。

01程序分析:
第一次:采用多重循环做。
02Bad Solution:

#include<stdio.h>
int main()
{
    int i,j,k;
    for(i=1;i<10;i++){
        for(j=1;j<=i;j++) {
            k = i*j;
            printf("%d * %d = %d  ", i, j, k);
        }
    printf("\n");
        }
    return 0;
}

【运行结果】

结果02

【缺陷】
1.输出的结果不整齐,可以左对齐。
03Correct Solution:

#include<stdio.h>
int main()
{
    int i, j;
    for(i=1;i<10;i++){
        for(j=1;j<=i;j++) {
            printf("%d * %d = %-3d  ", i, j, i*j);
        }
    printf("\n");
        }
    return 0;
}

【运行结果】

结果04

04题目总结:
1.printf()函数的声明。

int printf(const char *format, ...)

format 是字符串,包含了要被写入到标准输出 stdout 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier。
其中,flag标识使用如下。

flag标识

04中%-3d表示左对齐,占3位。

实例11:【斐波那契数列】❤️II

题目:古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总对数为多少?(输出前40个月即可)

01程序分析:
暂无
02Bad Solution:
暂无
03Correct Solution:
【方法一】

#include<stdio.h>

int main() {
    int f1,f2,i;//f1是奇数月的值,f2是偶数月的值
    f1=1;
    f2=1;
    for (i=1;i<=20;i++) {
        printf("第 %d 月兔子总数为 %d 对\n",2*i-1, f1);
        printf("第 %d 月兔子总数为 %d 对\n", 2*i, f2);
        f1=f1+f2;
        f2=f1+f2;
    }
    return 0;
}

【运行结果】


结果(方法一)

【方法二】

#include<stdio.h>

int num(int n){
    if(n<=2)
        return 1;
    else
        return num(n-1)+num(n-2);
}

int main() {
    int n=40;
    for(int i=1;i<=n;i++){
        printf("第%d月有%d对\n",i,num(i));
    }
    return 0;
}

04题目总结:
1.一般认为斐波那契数列的提出是基于兔子的繁殖问题:如果一开始有一对兔子,它们每月生育一对兔子,小兔在出生后一个月又开始生育且繁殖情况与最初的那对兔子一样,那么一年后有多少对兔子?
答案是,每月兔子的总数可以用以下数列表示:1,1,2,3,5,8,13,21,34,55,89,144,233…。
这一数列是意大利数论家列奥纳多·斐波那契(Leonardo Fibonacci)在他13世纪初的著作Liber Abaci中最早提出的。如果取数列前两个元素为1,那么递推关系就是:F_n=F_{n-1}+F_{n-2}
关键是要找到一个数前面的两个数,从第3个数开始,这个数就是前面两个数之和。

实例12:【素数+break】

题目:判断101到200之间的素数。

01程序分析:
第一次:素数是除了1和本身之外没有其它因子的数。
02Bad Solution:

#include<stdio.h>
int main() {
    int i, j;
    for (i = 101; i <= 200; i++) {
        for (j = 2;j <i; j++) {
            if (i % j == 0) { break; }
        }
        if(j>=i){printf("%d\n",i);}
    }
    return 0;
}

【运行结果】

结果02

【缺陷】为了使输出的结果更好看,可以用计数器,每行输出5个。
03Correct Solution:

#include<stdio.h>
int main() {
    int i, j;
    int count = 0;
    for (i = 101; i <= 200; i++) {
        for (j = 2; j < i; j++) {
            if (i % j == 0) { break; }
        }
        if (j >= i) {
            printf("%d ", i);
            count++;
            if (count % 5 == 0) { printf("\n"); }
        }
    }
    return 0;
}

【运行结果】
结果04

04题目总结:
1.C 语言中 break 语句有以下两种用法:

  • 当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。
  • 它可用于终止 switch 语句中的一个 case。
    【注】如果您使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。(终止内不循环,不终止外部循环)

——2.13更新——

实例13:【三位数把每位取出来】

题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

01程序分析:
第一次:
02Bad Solution:

#include<stdio.h>
int main() {
    int i,a,b,c;
    for(i=100;i<1000;i++)
    {
        a=i/100;
        b=(i-100*a)/10;
        c=i%10;
        if(i==a*a*a+b*b*b+c*c*c)
            printf("%d = %d^3 + %d^3 + %d^3\n",i,a,b,c);
    }
    return 0;
}

03Correct Solution:

#include<stdio.h>
int main() {
    int i,a,b,c;
    for(i=100;i<1000;i++)
    {
        a=i/100%10;
        b=i/10%10;
        c=i%10;
        if(i==a*a*a+b*b*b+c*c*c)
            printf("%d = %d^3 + %d^3 + %d^3\n",i,a,b,c);
    }
    return 0;
}

【注】这个里面去个、十、百位的数字的方法具有普适性。
【运行结果】

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

04题目总结:
暂无

实例14:【分解质因数】❤️II

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

01程序分析:
第一次:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
①如果这个质数恰等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束,打印出即可。
②但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n.重复执行第二步。
③如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
02Bad Solution:
暂无
03Correct Solution:

#include<stdio.h>
int main() {
    int n, i;
    printf("请输入一个正整数:");
    scanf("%d", &n);
    printf("%d =", n);
    if(n==1){
        printf(" 1不可分解");
    }
    for (i = 2; i <= n; i++) {//循环结束条件:如果这个质数恰等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束,另外 打印出即可。
        while (n % i == 0) {//while循环保证因数是质数
            printf(" %d ", i);
            n = n / i;
            if (n != 1) {
                printf("*");
            }
        }
    }
    return 0;
}

【运行结果】

请输入一个正整数:90
90 = 2 * 3 * 3 * 5

04题目总结:
暂无

实例15:【条件运算符的嵌套】

题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

01程序分析:
第一次:
02Bad Solution:

#include<stdio.h>
int main() {
    int score;
    printf("enter the score:");
    scanf("%d",&score);
    if(score>=90)
    {printf("A");}
    else if(score>=60)
    {printf("B");}
    else if(score<60)
    {printf("C");}
    return 0;
}

03Correct Solution:

#include<stdio.h>
int main() {
    int score;
    char grade;
    printf("enter the score:");
    scanf("%d",&score);
    grade=(score>=90?'A':(score>=60?'B':'C'));
    printf("%c",grade);
    return 0;
}

04题目总结:
1.运算符(三元运算符)
? :条件表达式,如果条件为真 ? 则值为 X : 否则值为 Y。它是从右到左结合,可以用来替代 if...else 语句。它的一般形式如下:

Exp1 ? Exp2 : Exp3;

其中,Exp1、Exp2 和 Exp3 是表达式。请注意,冒号的使用和位置。
? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个?表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个?表达式的值。

实例16:【初等数论】❤️

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

01程序分析:
最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数;求最大公约数用辗转相除法(又名欧几里德算法)。
证明:设c是a和b的最大公约数,记为c=gcd(a,b),a>=b,
令r=a mod b
设a=kc,b=jc,则k,j互素,否则c不是最大公约数
据上,r=a-mb=kc-mjc=(k-mj)c
可知r也是c的倍数,且k-mj与j互素,否则与前述k,j互素矛盾,
由此可知,b与r的最大公约数也是c,即gcd(a,b)=gcd(b,a mod b),得证。
算法描述:
第一步:a ÷ b,令r为所得余数(0≤r )
第二步:互换:置 a←b,b←r,并返回第一步。
02Bad Solution:
暂无
03Correct Solution:

#include<stdio.h>
int main()
{
    int a,b,t,r,n;
    printf("请输入两个数字:\n");
    scanf("%d %d",&a,&b);
    if(a<b)
    {t=b;b=a;a=t;}//让a是较大的那个数字
    r=a%b;
    n=a*b;
    while(r!=0){
        a=b;
        b=r;
        r=a%b;//上次的除数除以上次的余数(这里的a相当于一个临时变量)
    }
    printf("这两个数的最大公约数是%d,最小公倍数是%d\n",b,n/b);

    return 0;
}

04题目总结:
辗转相除法:
目的:求两个整数的最大公约数
最大公约数:能同时被两个整数整除的最大公约数

为什么用这个算法能得到两个数的最大公因数?

利用辗转相除法求最大公因数的步骤如下:
第一步:用较大的数a÷b得到一个商q_0和一个余数r_0
第二步:若r_0=0,则ba,b的最大公因数;若r_0≠0,则用除数b÷r_0得到一个商q_1和一个余数r_1
第三步:若r_1=0,则r_0a,b的最大公因数;若r_1≠0,则用除数r_0÷r_1得到一个商q_2和一个余数r_2
……
依次计算直至r_n=0,此时所得到的r_{n-1}即为所求的最大公因数。

实例17:【字符串】❤️II

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

01程序分析:
第一次:用while循环表示不同的情况。
02Bad Solution:
暂无
03Correct Solution:

#include<stdio.h>
int main() {
    int letters = 0, spaces = 0, digits = 0, others = 0;
    char c;//因为getchar函数。这里只开辟了一个字符,但是要输入字符串
    printf("请输入字符串:");
    while ((c = getchar()) != '\n') {//重要:这个while循环的条件记住
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))//易错:英文字母有大小写
            letters++;
        else if (c == ' ')
            spaces++;
        else if (c >= '0' && c <= '9')
            digits++;
        else
            others++;
    }
    printf("字母=%d,空格=%d,数字=%d,其它=%d",letters,spaces,digits,others);
    return 0;
}

04题目总结:
1.while()条件括号里装的表达式是(c = getchar()) != '\n'是如何运行的呢?

while((c=getchar())!='\n')的意思是:一直循环,等到用户输入回车为止,结束循环。

当程序调用getchar时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止。当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符。getchar函数的返回值是用户输入的字符的ASCII码,若文件结尾则返回-1(EOF),且将用户输入的字符回显到屏幕。

(c=getchar())!='\n'表示的条件语句意思是:判断用户的输入字符不是'\n',即回车,只要用户输入的不是回车,while循环就会一直执行。

C 库函数 int getchar(void) 从标准输入 stdin 获取一个字符(一个无符号字符)。
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

实例18:【循环】

题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。

01程序分析:
方法一:用for循环控制几个数相加。
方法二:用while循环来做,更简洁。
02Bad Solution:
暂无
03Correct Solution:
【方法一】

#include<stdio.h>
int main() {
    int a, s, i, count, temp;
    printf("请输入一个数:");
    scanf("%d", &a);
    printf("请输入相加的个数:");
    scanf("%d", &count);
    s = 0;
    temp=0;
    for (i = 1; i <= count; i++) {
        temp = temp * 10 + a;
        s = s + temp;
        printf("%d",temp);
        if(i!=count){printf(" + ");}
    }
    printf(" = %d",s);
    return 0;
}

【运行结果】

请输入一个数:2
请输入相加的个数:5
2 + 22 + 222 + 2222 + 22222 = 24690

【方法二】

#include<stdio.h>
int main() {
    int s=0,a,n,t;
    printf("请输入 a 和 n:\n");
    scanf("%d%d",&a,&n);
    t=a;//输入了a之后才能赋值
    while(n>0){
        s=s+t;
        t=t*10+a;
        n--;
    }
    printf("a+aa+aaa+···= %d ",s);
    return 0;
}

04题目总结:
暂无

实例19:【完数➕数组】❤️

题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。

01程序分析:
第一次:
02Bad Solution:
暂无
03Correct Solution:

#include<stdio.h>
int main()
{
    int i,j,n,sum;
    int a[256],k;//最后结果要把所有因数都显示出来,需要一个数组来装因数,k为数组下标
    for(i=2;i<1000;i++)
    {
        sum=a[0]=1;//1是任意数的因数
        k=0;
        for(j=2;j<=(i/2);j++) {
            if (i % j == 0) {//补充:质因数时用while循环,这里不要求是质因数
                sum = sum + j;
                a[++k] = j;//前自增先自增后做其他操作
            }
        }
        //判断是否是完数,是的话输出
        if(i==sum)
        {
            printf("%d=%d",i,a[0]);
            for(n=1;n<=k;n++)
                printf("+%d",a[n]);
            printf("\n");
        }
    }
    return 0;
}

【运行结果】

6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124+248

04题目总结:
暂无

实例20:【衰减】❤️II

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

01程序分析:
方法一:
02Bad Solution:

#include<stdio.h>
int main() {
    int i;
    float s=100,l=s;
    for(i=1;i<=10;i++){
        s=s/2;
        l=l+s;
    }
    printf("共经过%f米",l);
    printf("第10次反弹%f米",s);
    return 0;
}

【运行结果】

共经过199.902344米
第10次反弹0.097656米

【错误】
反弹是一个来回,应该是l=l+s*2。因为算的是第十次落地是多少米,所以第10次还没有被弹起,循环9次(2倍9次)。
03Correct Solution:

#include<stdio.h>
int main() {
    int i;
    float s=100,l=s;
    s=s/2//第1次的反弹高度
    for(i=2;i<=10;i++){//从第2次落地开始计算,因为初始高度不用乘2
        l=l+s*2;
        s=s/2;
    }
    printf("共经过%f米\n",l);
    printf("第10次反弹%f米",s);
    return 0;
}

【运行结果】

共经过299.609375米
第10次反弹0.097656米

04题目总结:
暂无

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容