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

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)的更多相关文章

  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. OpenStack Train版-8.安装neutron网络服务(控制节点)

    安装neutron网络服务(controller控制节点192.168.0.10) 创建neutron数据库 mysql -uroot CREATE DATABASE neutron; GRANT A ...

  2. Python——Django框架——Form框架

    一.引入Form包 from django import forms 二.定义规则 class Forms_Login(forms.Form): 用户名 = forms.CharField(requi ...

  3. Linux POSIX共享内存方法&ipcs &struct shmid_ds

    内容是主进程创建子进程计算斐波那契数列. 其中计算到第几项是有主进程命令行输入. 共享内存段,并且查看了一些信息. 参考操作系统概念第七版 3.10,3.11 关于LINUX C库函数 中的 fpri ...

  4. 一个C++源文件从文本到可执行文件经历的过程

    一个C++源文件从文本到可执行文件经历的过程 以Hello World为例进行说明 首先我们编写一个cpp源程序 test.cpp #include <iostream> using na ...

  5. 指纹采集器Live 20R

    最近有个项目需要使用指纹采集器Live 20R,买来这个小玩意后不知道怎么用,看了一些教程和自己摸索了一下,才初步掌握了用的方法. 环境: 硬件:联想 小新 操作系统:Win 10 IDE:VS201 ...

  6. 011.NET5_MVC解读Razor混编

    MVC开发 1. 什么是MVC? V-视图,呈现给用户看到的内容---表现层 C-控制器,控制业务逻辑计算,可定义多种返回类型.可以是视图模型.JSON.字符串等等 M-视图模型,用于视图和控制之间传 ...

  7. 2021-2-18:请你说说MySQL的字符集与排序规则对开发有哪些影响?

    任何计算机存储数据,都需要字符集,因为计算机存储的数据其实都是二进制编码,将一个个字符,映射到对应的二进制编码的这个映射就是字符编码(字符集).这些字符如何排序呢?决定字符排序的规则就是排序规则. 查 ...

  8. How to get the real screen size(screen resolution) by using js

    How to get the real screen size(screen resolution) by using js 获取用户屏幕的真实像素分辨率, 屏幕实际尺寸 window.deviceP ...

  9. Github access token

    Github access token https://github.com/settings/tokens https://docs.github.com/en/free-pro-team@late ...

  10. Learning CSS with Chrome DevTools

    Learning CSS with Chrome DevTools CSS 复合属性展开 border background box-shadow flex-flow flex HTML5 custo ...