美文网首页
C语言编程 菜鸟练习100题(21-30)

C语言编程 菜鸟练习100题(21-30)

作者: youcans | 来源:发表于2021-03-11 11:15 被阅读0次

    【练习21】计算自然数的和

    0. 题目:
    计算自然数的和
    1. 分析:
    练习使用 for 循环结构。for 循环允许一个执行指定次数的循环控制结构。
    2. 程序:

    #include <stdio.h> 
    int main()
    {
        int i, iNum, iSum;
        
        printf("输入一个正整数: ");
        scanf("%d",&iNum);
     
        iSum = 0;
        for(i=1; i <= iNum; i++)
        {
            iSum += i;  // iSum = iSum + i;
        }
        printf("Sum = %d",iSum);
     
        return 0;
    }
    

    3. 输入输出:

    输入一个正整数: 10
    Sum = 55


    【练习22】输出九九乘法口诀表

    0. 题目:
    输出九九乘法口诀表
    1. 分析:
    练习使用嵌套 for 循环。对于嵌套的循环结构,执行顺序是从内到外:先执行内层循环,再执行外层循环。
    2. 程序:

    #include<stdio.h>  
    int main()
    {  
        int i = 0;  //外层循环变量,控制行
        int j = 0;   //内层循环变量,控制列
    
        for(i=1;i<=9;i++)
        {  
            for(j=1;j<=i;j++)
            {
                printf("%dx%d=%d\t",j,i,i*j);
                //printf("%dx%d=%-4d",j,i,i*j);  // %-4d 表示左对齐,4个字符位
            }
            printf("\n");  //每行输出完后换行
        }
        
        return 0;
    }
    

    3. 输入输出:

    1x1=1
    1x2=2 2x2=4
    1x3=3 2x3=6 3x3=9
    1x4=4 2x4=8 3x4=12 4x4=16
    1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
    1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
    1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
    1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
    1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81


    【练习23】阶乘

    0. 题目:
    阶乘
    1. 分析:
    自然数 n 的阶乘写作n!,n!=1×2×3×...×n。
    阶乘也可以递归方式定义:0!=1,n!=(n-1)!×n。
    本题练习使用递归方法。
    2. 程序:

    #include <stdio.h>
    long int multiplyNum(int n);  // 声明子程序
     
    int main()
    {
        int n;
        printf("输入一个整数: ");
        scanf("%d", &n);
        printf("%d! = %ld", n, multiplyNum(n));
        return 0;
    }
    
    long int multiplyNum(int n)
    {
        if (n >= 1)
            return n * multiplyNum(n-1);  // n!=n*(n-1)!
        else
            return 1;  // 0!=1
    }
    

    3. 输入输出:

    输入一个整数: 10
    10! = 3628800


    【练习24】斐波那契数列

    0. 题目:
    斐波那契数列
    1. 分析:
    斐波那契数列以兔子繁殖为例引入,从第3项开始每一项都等于前两项之和。
    可以使用循环方法求解,也可以使用递归方法求解。
    2. 程序:
    2.1 程序1:循环方法

    #include <stdio.h> 
    int main()
    {
        int i, iNum, iFibOne, iFibTwo, nextTerm;
     
        printf("输出几项: ");
        scanf("%d", &iNum);
     
        printf("斐波那契数列: ");
        iFibOne = 1;
        iFibTwo = 1;
        for (i = 1; i <= iNum; i++)
        {
            printf("%d, ", iFibOne);
            nextTerm = iFibOne + iFibTwo;
            iFibOne = iFibTwo;
            iFibTwo = nextTerm;
        }
        return 0;
    }
    

    2.2 程序2:递归方法

    #include <stdio.h>
    int Fibonacci(int n);  // 声明子程序
    int main()  //递归方法 
    {
        int i, iNum, iFibOne, iFibTwo, nextTerm;
     
        printf("输出几项: ");
        scanf("%d", &iNum);
     
        printf("斐波那契数列: ");
        for (i = 1; i <= iNum; i++)
        {
            printf("%d, ", Fibonacci(i));
        }
        return 0;
    }
    
    int Fibonacci(int n)
    {
        return n < 2 ? n : Fibonacci(n - 1) + Fibonacci(n - 2);
    }
    

    3. 输入输出:

    输出几项: 10
    斐波那契数列: 1, 1, 2, 3, 5, 8, 13, 21, 34,55,

    【注意!】 虽然斐波那契数列经常被用做递归方法的练习,但循环方法的时间复杂度为O(n)、空间复杂度为O(1),都优于递归方法的时间复杂度为O(n^2)、空间复杂度为O(n)。求解斐波那契数列还可以使用通项公式方法、矩阵乘法实现,算法的性能更好。


    【练习25】求两数的最大公约数

    0. 题目:
    求两数的最大公约数
    1. 分析:
    求两数的最大公约数,无论在求解算法还是编程方法上都有很多方法,本例程针对初学者给出的是最简单和便于理解的方法。
    2. 程序:

    #include <stdio.h> 
    int main()
    {
        int i, iNum1, iNum2, iGcd;
    
        printf("输入两个正整数,以空格分隔: ");
        scanf("%d %d", &iNum1, &iNum2);
    
        for(i=1; i <= iNum1 && i <= iNum2; i++)
        {
            if(iNum1%i==0 && iNum2%i==0)  // 判断 i 是否为最大公约数
                iGcd = i;
        }
    
        printf("%d 和 %d 的最大公约数是 %d", iNum1, iNum2, iGcd);
    
        return 0;
    }
    

    3. 输入输出:

    输入两个正整数,以空格分隔: 81 153
    81 和 153 的最大公约数是 9


    【练习26】求两数最小公倍数

    0. 题目:
    求两数最小公倍数
    1. 分析:
    本例程练习使用 while 循环、简化的条件判断。
    2. 程序:

    #include <stdio.h>
    
    int main()
    {
        int iNum1, iNum2, iMinMultiple;
        printf("输入两个正整数,以空格分隔: ");
        scanf("%d %d", &iNum1, &iNum2);
     
        // 判断两数较大的值,并赋值给 minMultiple
        iMinMultiple = (iNum1>iNum2) ? iNum1 : iNum2;
        
        while(1)  // 条件为 true
        {
            if( iMinMultiple%iNum1==0 && iMinMultiple%iNum2==0 )
            {
                printf("%d 和 %d 的最小公倍数为 %d", iNum1, iNum2,iMinMultiple);
                break;
            }
            iMinMultiple++;
        }
        
        return 0;
    }
    

    3. 输入输出:

    输入两个正整数: 45 120
    45 和 120 的最小公倍数为 360


    【练习27】 循环输出26个字母

    0. 题目:
    循环输出26个字母
    1. 分析:
    学习 for 循环的格式:for(循环变量赋初值;循环条件;循环变量增值)
    其中常用的循环变量类型是整数或浮点数,但也可以是其它类型,例如本例中的字符型变量。
    此外,字符值是以 ASCII 码形式存放在内存单元中。C语言允许字符变量参与数值运算,即用字符的 ASCII 码参与运算。但 ASCII 码参与运算时需要注意避免数据溢出等错误。
    2. 程序:

    #include <stdio.h>
    int main()
    {
        char cInput, cOut;
     
        printf("输入 U 显示大写字母,输入 L 显示小写字母: ");
        scanf("%c", &cInput);
     
        if(cInput== 'U' || cInput== 'u')
        {
           for(cOut = 'A'; cOut <= 'Z'; cOut++)
             printf("%c ", cOut);
        }
        else if (cInput== 'L' || cInput== 'l')
        {
            for(cOut = 'a'; cOut <= 'z'; cOut++)
             printf("%c ", cOut);
        }
        else
           printf("Error! 输入非法字符。");
           
        return 0;
    }
    

    3. 输入输出:

    输入 U 显示大写字母,输入 L 显示小写字母: L
    a b c d e f g h i j k l m n o p q r s t u v w x y z


    【练习28】判断数字为几位数

    0. 题目:
    判断数字为几位数
    1. 分析:
    学习 while 循环的基本格式:while(表达式){语句块}
    2. 程序:

    #include <stdio.h>
    int main()
    {
        long lNum;
        int iCount = 0;
     
        printf("输入一个整数: ");
        scanf("%ld", &lNum);
        printf("数字 %ld 是", lNum);
     
        while(lNum != 0)
        {
            lNum /= 10;
            iCount++;
        }
    
        printf(" %d 位数。", iCount);
        return 0;
    }
    

    3. 输入输出:

    输入一个整数: 1234500
    数字是 7 位数。

    【注意!】 由于例程中 lNum 的值被改变,因此在前后使用了两个 printf 语句进行输出。


    【练习29】 计算一个数的 n 次方

    0. 题目:
    计算一个数的 n 次方
    1. 分析:
    学习 while 循环的基本格式:while(表达式){语句块}。
    2. 程序:

    #include <stdio.h> 
    int main()
    {
        int iBase, iExponent;
        long lResult = 1;
     
        printf("请输入基数(整数): ");
        scanf("%d", &iBase);
        printf("请输入指数(整数): ");
        scanf("%d", &iExponent);
    
        printf("power(%d,%d) ", iBase,iExponent);
        while (iExponent != 0)
        {
            lResult *= iBase;
            iExponent--;
        }
        printf(": %ld", lResult);
     
        return 0;
    }
    

    3. 输入输出:

    请输入基数(整数): 2
    请输入指数(整数): 10
    power(2,10) : 1024


    【练习30】判断回文数

    0. 题目:
    判断回文数
    1. 分析:
    如果将一个自然数各位数字反向排列后所得到的自然数与原数相等,则称为回文数。例如:1234321 是回文数,1234567不是回文数。
    例程1 先对原数反序得到新数,再比较反序后的新数与原数的数值是否相等,这种方法思路简单,容易理解。例程2 并不产生新数,直接比较原数的正向、反向对应位置字符是否相同,这种方法更加简洁高效。
    2. 程序:
    2.1 程序1:比较反序后的新数与原数的数值是否相等

    #include <stdio.h>
    int main()
    {
        int iNum, iOriginal, iReversed, iRemainder;
     
        printf("输入一个整数: ");
        scanf("%d", &iNum);
     
        iOriginal = iNum;
        iReversed = 0;
        // 将输入整数 iNum 的各位数字反向排列得到 iReversed
        while( iNum!=0 )
        {
            iRemainder = iNum % 10; // 取个位数
            iReversed = iReversed*10 + iRemainder;
            iNum /= 10;
        }
     
        // 判断反序后与原数是否相等
        if (iOriginal == iReversed)
            printf("%d 是回文数。", iOriginal);
        else
            printf("%d 不是回文数。", iOriginal);
        
        return 0;
    }
    

    2.2 程序2:直接比较原数的正向、反向对应位置字符是否相同

    #include <stdio.h>
    #include <string.h>  // 字符数组操作
    int main()
    {
        char cStr[99];  // 定义字符数组(字符串)
        int i, iLen, iMark;
     
        printf("输入一个整数(或字符串): ");
        gets(cStr);  // 可以输入整数,但也是按字符串保存
    
        iMark = 1;  // 判断标志
        iLen = strlen(cStr);  // 字符串长度
        for(int i=0;i<iLen/2;i++)
        {
            if (cStr[i]!=cStr[iLen-i-1])  // 比较原数的正反向对应位置字符
                iMark = 0;
        }
    
        if(iMark)
            printf("%s 是回文串", cStr);
        else
            printf("%s 不是回文串", cStr);
        return 0;
    }
    

    3. 输入输出:

    输入一个整数: 1230321
    1230321 是回文数


    版权说明:
    题目和例程 源于 菜鸟教程,作者重新编写了程序、注释和算例,并增加了难点分析。

    相关文章

      网友评论

          本文标题:C语言编程 菜鸟练习100题(21-30)

          本文链接:https://www.haomeiwen.com/subject/igtzqltx.html