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

0. 题目:

计算自然数的和

1. 分析:

练习使用 for 循环结构。for 循环允许一个执行指定次数的循环控制结构。

2. 程序:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i, iNum, iSum;
  5. printf("输入一个正整数: ");
  6. scanf("%d",&iNum);
  7. iSum = 0;
  8. for(i=1; i <= iNum; i++)
  9. {
  10. iSum += i; // iSum = iSum + i;
  11. }
  12. printf("Sum = %d",iSum);
  13. return 0;
  14. }

3. 输入输出:

输入一个正整数: 10

Sum = 55


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

0. 题目:

输出九九乘法口诀表

1. 分析:

练习使用嵌套 for 循环。对于嵌套的循环结构,执行顺序是从内到外:先执行内层循环,再执行外层循环。

2. 程序:

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

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. 程序:

  1. #include <stdio.h>
  2. long int multiplyNum(int n); // 声明子程序
  3. int main()
  4. {
  5. int n;
  6. printf("输入一个整数: ");
  7. scanf("%d", &n);
  8. printf("%d! = %ld", n, multiplyNum(n));
  9. return 0;
  10. }
  11. long int multiplyNum(int n)
  12. {
  13. if (n >= 1)
  14. return n * multiplyNum(n-1); // n!=n*(n-1)!
  15. else
  16. return 1; // 0!=1
  17. }

3. 输入输出:

输入一个整数: 10

10! = 3628800


【练习24】斐波那契数列

0. 题目:

斐波那契数列

1. 分析:

斐波那契数列以兔子繁殖为例引入,从第3项开始每一项都等于前两项之和。

可以使用循环方法求解,也可以使用递归方法求解。

2. 程序:

2.1 程序1:循环方法

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i, iNum, iFibOne, iFibTwo, nextTerm;
  5. printf("输出几项: ");
  6. scanf("%d", &iNum);
  7. printf("斐波那契数列: ");
  8. iFibOne = 1;
  9. iFibTwo = 1;
  10. for (i = 1; i <= iNum; i++)
  11. {
  12. printf("%d, ", iFibOne);
  13. nextTerm = iFibOne + iFibTwo;
  14. iFibOne = iFibTwo;
  15. iFibTwo = nextTerm;
  16. }
  17. return 0;
  18. }

2.2 程序2:递归方法

  1. #include <stdio.h>
  2. int Fibonacci(int n); // 声明子程序
  3. int main() //递归方法
  4. {
  5. int i, iNum, iFibOne, iFibTwo, nextTerm;
  6. printf("输出几项: ");
  7. scanf("%d", &iNum);
  8. printf("斐波那契数列: ");
  9. for (i = 1; i <= iNum; i++)
  10. {
  11. printf("%d, ", Fibonacci(i));
  12. }
  13. return 0;
  14. }
  15. int Fibonacci(int n)
  16. {
  17. return n < 2 ? n : Fibonacci(n - 1) + Fibonacci(n - 2);
  18. }

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. 程序:

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

3. 输入输出:

输入两个正整数,以空格分隔: 81 153

81 和 153 的最大公约数是 9


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

0. 题目:

求两数最小公倍数

1. 分析:

本例程练习使用 while 循环、简化的条件判断。

2. 程序:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int iNum1, iNum2, iMinMultiple;
  5. printf("输入两个正整数,以空格分隔: ");
  6. scanf("%d %d", &iNum1, &iNum2);
  7. // 判断两数较大的值,并赋值给 minMultiple
  8. iMinMultiple = (iNum1>iNum2) ? iNum1 : iNum2;
  9. while(1) // 条件为 true
  10. {
  11. if( iMinMultiple%iNum1==0 && iMinMultiple%iNum2==0 )
  12. {
  13. printf("%d 和 %d 的最小公倍数为 %d", iNum1, iNum2,iMinMultiple);
  14. break;
  15. }
  16. iMinMultiple++;
  17. }
  18. return 0;
  19. }

3. 输入输出:

输入两个正整数: 45 120

45 和 120 的最小公倍数为 360


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

0. 题目:

循环输出26个字母

1. 分析:

学习 for 循环的格式:for(循环变量赋初值;循环条件;循环变量增值)

其中常用的循环变量类型是整数或浮点数,但也可以是其它类型,例如本例中的字符型变量。

此外,字符值是以 ASCII 码形式存放在内存单元中。C语言允许字符变量参与数值运算,即用字符的 ASCII 码参与运算。但 ASCII 码参与运算时需要注意避免数据溢出等错误。

2. 程序:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char cInput, cOut;
  5. printf("输入 U 显示大写字母,输入 L 显示小写字母: ");
  6. scanf("%c", &cInput);
  7. if(cInput== 'U' || cInput== 'u')
  8. {
  9. for(cOut = 'A'; cOut <= 'Z'; cOut++)
  10. printf("%c ", cOut);
  11. }
  12. else if (cInput== 'L' || cInput== 'l')
  13. {
  14. for(cOut = 'a'; cOut <= 'z'; cOut++)
  15. printf("%c ", cOut);
  16. }
  17. else
  18. printf("Error! 输入非法字符。");
  19. return 0;
  20. }

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. 程序:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. long lNum;
  5. int iCount = 0;
  6. printf("输入一个整数: ");
  7. scanf("%ld", &lNum);
  8. printf("数字 %ld 是", lNum);
  9. while(lNum != 0)
  10. {
  11. lNum /= 10;
  12. iCount++;
  13. }
  14. printf(" %d 位数。", iCount);
  15. return 0;
  16. }

3. 输入输出:

输入一个整数: 1234500

数字是 7 位数。

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


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

0. 题目:

计算一个数的 n 次方

1. 分析:

学习 while 循环的基本格式:while(表达式){语句块}。

2. 程序:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int iBase, iExponent;
  5. long lResult = 1;
  6. printf("请输入基数(整数): ");
  7. scanf("%d", &iBase);
  8. printf("请输入指数(整数): ");
  9. scanf("%d", &iExponent);
  10. printf("power(%d,%d) ", iBase,iExponent);
  11. while (iExponent != 0)
  12. {
  13. lResult *= iBase;
  14. iExponent--;
  15. }
  16. printf(": %ld", lResult);
  17. return 0;
  18. }

3. 输入输出:

请输入基数(整数): 2

请输入指数(整数): 10

power(2,10) : 1024


【练习30】判断回文数

0. 题目:

判断回文数

1. 分析:

如果将一个自然数各位数字反向排列后所得到的自然数与原数相等,则称为回文数。例如:1234321 是回文数,1234567不是回文数。

例程1 先对原数反序得到新数,再比较反序后的新数与原数的数值是否相等,这种方法思路简单,容易理解。例程1 并不产生新数,直接比较原数的正向、反向对应位置数字是否相同,这种方法更加简洁高效。

2. 程序:

2.1 程序1:比较反序后的新数与原数的数值是否相等

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int iNum, iOriginal, iReversed, iRemainder;
  5. printf("输入一个整数: ");
  6. scanf("%d", &iNum);
  7. iOriginal = iNum;
  8. iReversed = 0;
  9. // 将输入整数 iNum 的各位数字反向排列得到 iReversed
  10. while( iNum!=0 )
  11. {
  12. iRemainder = iNum % 10; // 取个位数
  13. iReversed = iReversed*10 + iRemainder;
  14. iNum /= 10;
  15. }
  16. // 判断反序后与原数是否相等
  17. if (iOriginal == iReversed)
  18. printf("%d 是回文数。", iOriginal);
  19. else
  20. printf("%d 不是回文数。", iOriginal);
  21. return 0;
  22. }

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

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

3. 输入输出:

输入一个整数: 1230321

1230321 是回文数


版权说明:

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

C语言编程 菜鸟练习100题(21-30)的更多相关文章

  1. C语言编程 菜鸟练习100题(51-60)

    [练习51]矩阵转置 0. 题目: 矩阵的转置 1. 分析: 练习使用 for 循环嵌套,多维数组的表达. 2. 程序: #include <stdio.h> int main() { i ...

  2. C语言编程 菜鸟练习100题(31-40)

    [练习31]判断质数 0. 题目: 判断质数 1. 分析: 质数(prime number),指大于 1的.且除 1 和本身以外没有其他因数的自然数. 2. 程序: #include <stdi ...

  3. C语言编程 菜鸟练习100题(41-50)

    [练习41]字符串翻转 0. 题目: 字符串翻转 1. 分析: 学习递归思想和方法. 2. 程序: 方法一: #include <stdio.h> void reverseSentence ...

  4. C语言编程 菜鸟练习100题(11-20)

    [练习11]计算 int, float, double 和 char 字节大小 0. 题目: 计算 int, float, double 和 char 字节大小 1. 分析: 使用 sizeof 操作 ...

  5. C语言编程 菜鸟练习100题(01-10)

    [练习1]输出 "Hello, World!" 0. 题目: 输出 "Hello, World!" 1. 分析: 使用 printf() 输出 "He ...

  6. C语言编程学习打造——做题游戏

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  7. 数据结构+算法面试100题~~~摘自CSDN

    数据结构+算法面试100题~~~摘自CSDN,作者July 1.把二元查找树转变成排序的双向链表(树) 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调 ...

  8. Go面试题精编100题

    Golang精编100题 选择题 1.   [初级]下面属于关键字的是()A. funcB. defC. structD. class 参考答案:AC 2.   [初级]定义一个包内全局字符串变量,下 ...

  9. 华为C语言编程规范

    DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...

随机推荐

  1. Chrony时间同步

    chrony 服务器 yum -y install chrony cp /etc/chrony.conf{,.bak} #备份默认配置 cat > /etc/chrony.conf <&l ...

  2. SDN总结

    之前做项目用到了SDN,知道其作用,但是对其不是特别熟悉,今天特来总结一下相关知识点: 1. SDN的典型架构分为哪三层 主要分为应用层,控制层,和基础设施层: 2. SDN技术的关键点是 控制平面和 ...

  3. Excel 如何固定表头

    Excel 如何固定表头 视图-冻结窗格-冻结首行 EXCEL如何设置固定表头 一.首先打开Excel表格,如果你的表头只有一行,那么直接选择"视图-冻结窗格-冻结首行"就可以了. ...

  4. Chinese Parents Game

    Chinese Parents Game <中国式家长>是一款模拟养成游戏. 玩家在游戏中扮演一位出生在普通的中式家庭的孩子. https://en.wikipedia.org/wiki/ ...

  5. Mapbox 地图实验室

    Mapbox 地图实验室 Learn with Mapbox https://www.mapbox.com/community/education/ https://labs.mapbox.com/e ...

  6. Microsoft Lifecycle Policy

    Microsoft Lifecycle Policy The Microsoft Lifecycle Policy gives you consistent and predictable guide ...

  7. vue SSR & asyncData & nuxt.js

    vue SSR & asyncData & nuxt.js https://zh.nuxtjs.org/api/ https://www.cnblogs.com/xgqfrms/p/1 ...

  8. 03.Jupyter Notebook高级-魔法命令

    %run %run C:\Users\User\Desktop\hello.py hello world %timeit %timeit L = [i for i in range(1000)] 29 ...

  9. CPU使用率原理及计算方式

    本文转载自CPU使用率原理及计算方式 CPU:超线程和多核 超线程(Hyper-Threading ) 超线程是Intel最早提出一项技术,最早出现在2002年的Pentium4上.单个采用超线程的C ...

  10. K8s炼气期(一)| minikube安装本地Kubenetes环境

    前言 根据Kubenetes学习路径的七大阶段,炼气期.筑基期.金丹期.元婴期.化神期.炼虚期.大乘期:开始炼气期的第一个小阶段,安装Kubenetes环境. 目录 1.安装kubectl 2.安装m ...