1. 打印 1~100之间的奇数
1.1 题目描述
使⽤C语⾔写⼀个程序打印 1~100之间的奇数,要求输出的数字中间加上空格
1.2 解法思路
整数中,能被2整除的数是偶数,不能被 2 整除的数是奇数,奇数的个位为 1,3,5,7,9。对于
1~100 之间的奇数,我们可以进⾏如下操作:
- 利⽤循环语句 for 从 1 开始迭代到 100;
- 使⽤条件语句 if 来检查每个数字是否为奇数(即除以 2 余数不为 0 );
- 如果数字是奇数,则我们使⽤ printf 函数将其打印到控制台上,并在数字之间添加⼀个空
格;
- 最后,我们在 main 函数中返回 0 ,表⽰程序已成功执⾏。
特别说明:对于每个相邻的奇数,他们的差为 2,因此我们可以在 for 循环语句中迭代时只遍历 奇数⽽省略了判断的过程。
1.3 代码
//⽅法1
//C语⾔头⽂件
#include <stdio.h>
int main()
{
//定义变量⽤来遍历1~100
int i = 0;
//for循环语句,将i初始化为1,当i不⼤于100时进⼊循环,i的值加⼀后继续判断进⼊循环的条件
for(i=1; i<=100; i++)
{
//判断当前i的值是否为奇数,若是则打印i的值以及⼀个空格
if(i%2==1)
printf("%d ", i);
}
//在main函数中返回0,表⽰程序已成功执⾏
return 0;
}
//⽅法2
#include <stdio.h>
int main()
{
//定义变量⽤来遍历1~100的奇数
int i = 0;
//for循环语句,将i初始化为1,当i不⼤于100时进⼊循环,i的值加⼆后继续判断进⼊循环的条件
for(i=1; i<=100; i+=2)
{
//进⼊循环时,i的值为奇数,直接将其打印并打印空格
printf("%d ", i);
}
//在main函数中返回0,表⽰程序已成功执⾏
return 0;
}
1.4 运行结果
2.打印9*9乘法⼝诀表
2.1 题目描述
使用C语言写一个程序打印9*9乘法口诀表,如下图
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3= 9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
2.2 解题思路
“*”是乘号,乘号前⾯和后⾯的数叫做因数,“=”是等于号,等于号后⾯的数叫做积。在打印乘
法⼝诀时我们需要两个元素⽤来记录两个因数,并且需要使⽤两个嵌套的 for 循环来迭代⾏和列。
- 在外部循环中,我们⽤
i
迭代⾏号,从1
到9
,表⽰乘法表中的第i
⾏;
- 在内部循环中,我们⽤
j
迭代列号,从1
到i
,表⽰第i
⾏中的第j
列;
- 然后使⽤
printf
函数打印出每⼀项,包括被两个因数和乘积,它们⽤空格隔开,并且使⽤%2d
格式控制符将乘积左对⻬输出,使得每个乘积占两个字符宽度;
- 在打印完每⼀⾏后,需要继续打印⼀个
\n
,表⽰当前⾏遍历结束,开始下⼀⾏的打印
- 在
main
函数中返回0
,表⽰程序已成功执⾏
2.3 解法代码
#include <stdio.h>
int main()
{
//定义两个变量⽤来迭代⾏和列
int i = 0;
int j = 0;
//控制9⾏
for (i = 1; i <= 9; i++)
{
//每⼀⾏打印⼏项
for (j = 1; j <= i; j++)
{
//打印当前的乘法公式
printf("%d*%d=%2d ", i, j, i * j);
}
//打印⼀个换⾏符,进⾏下⼀⾏的打印
printf("\n");
}
//在 main 函数中返回 0,表⽰程序已成功执⾏。
return 0;
}
2.4 运行结果
3.打印素数
3.1 题目解析
使用C语言写一个程序打印100-200之间的素数,数字中间使用空格分割
3.2 解题思路
素数是指只能被1和它本⾝整除的正整数。我们可以遍历100~200,并找出哪些数字是素数,这⾥给
出⼏个判断 数字 x 是否为素数的⽅法:
• 试除法:
a. 从 2 到 x-1,逐个尝试是否能整除 x,如果能,x 就不是素数,否则 x 是素数。
b. 当 x 为偶数时,x ⼀定不是素数,因此在遍历时我们可以跳过每个偶数。
• 试除法时间优化
a. 当 2 到 x-1 中存在某个数 t 可以整除 x 时,令 d=x/t,则 d 也可以整除 x,并且结果为 t。因
此,当 2~√x 中不存在可以整除 x 的数时,√x+1~x 也不存在可以整除 x 的数。
b. 利⽤反证法证明:
i. 假设 2 到 x-1 中不存在可以整除 x 的数,√x+1~x 中存在⼀个数 d 可以整除 x;
ii. 存在另⼀个数 t=x/d 也可以整除 x;
iii. t*d=x,因为 d>√x,所以 t<√x,即 2 到 x-1 中存在某个数 t 可以整除 x;
iv. 与假设⽭盾,反证成⽴。
3.3 解法代码
//⽅法1
#include <stdio.h>
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
int j = 0;
//判断i是否为素数
int flag = 1;//定义变量记录当前数是否为素数,假设是素数,变量值为1
//遍历2~当前数-1
for (j = 2; j < i; j++)
{
//存在⼀个数可以整除当前数
if (i % j == 0)
{
flag = 0;//不是素数
break;
}
}
if (flag == 1)//是素数就打印
printf("%d ", i);
}
return 0;
}
//优化1
#include <stdio.h>
int main()
{
int i = 0;
//因为偶数不是素数,直接跳过
for (i = 101; i <= 200; i+=2)
{
int j = 0;
//判断i是否为素数
int flag = 1;//定义变量记录当前数是否为素数,假设是素数,变量值为1
//遍历2~当前数-1
for (j = 2; j < i; j++)
{
//存在⼀个数可以整除当前数
if (i % j == 0)
{
flag = 0;//不是素数
break;
}
}
if (flag == 1)//是素数就打印
printf("%d ", i);
}
return 0;
}
//优化2
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
//因为偶数不是素数,直接跳过
for (i = 101; i <= 200; i+=2)
{
int j = 0;
//判断i是否为素数
int flag = 1;//定义变量记录当前数是否为素数,假设是素数,变量值为1
//遍历2~当前数的根号
for (j = 2; j <=sqrt(i); j++)
{
//存在⼀个数可以整除当前数
if (i % j == 0)
{
flag = 0;//不是素数
break;
}
}
if (flag == 1)//是素数就打印
printf("%d ", i);
}
return 0;
}
3.4 运行结果
4.判断三角形
4.1 题目解析
输⼊三个整数a,b,c,判断由a,b,c作为三条边组成的三⻆形,如果不能组成三⻆形则输出:⾮三⻆形;如果是三⻆形,再继续判断,如果是等边三⻆形,则输出:等边三⻆形;如果是等腰三⻆形,则输出:等腰三⻆形;否则输出普通三⻆形
测试1:
输入: 9 8 5
输出:该三角形为普通三角形
测试2:
输入: 9 9 9
输出:该三角形为等边三角形
测试3:
输入: 8 8 6
输出:该三角形为等腰三角形
测试4:
输入:4 5 9
输出:注意:不能构成合法三角形
4.2 解法思路
三⻆形的判断⽅法是:对于三条边⻓a、b、c,若任意两边之和⼤于第三边,那么就可以组成⼀个三
⻆形,即a+b>c, a+c>b, b+c>a。
如果组成了三⻆形,再判断是什么三⻆形,有三种情况:
- 等边三⻆形:三边相等;
- 等腰三⻆形:两边相等,但不等于第三边;
- 普通三⻆形:三边不相等。
最后,如果输⼊的三个数不能组成三⻆形,则输出“注意:不能构成合法三角形”
4.4解法代码
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d", &a, &b, &c);
//三⻆形必须满⾜任意两天边⼤于第三条边
if (a + b > c && a + c > b && b + c > a)
{
//三条边相当
if (a == b && b == c)
{
printf("等边三⻆形\n");
}
//任意两条边相等,但是不等于第三条边,此时只需要判断是否有两条边相等
else if (a == b || a == c || b == c)
{
printf("等腰三⻆形\n");
}
//两种情况都不满⾜输出普通三⻆形
else
{
printf("普通三⻆形\n");
}
}
//不能构成三⻆形
else
{
printf("⾮三⻆形\n");
}
return 0;
}
5.计算最大公约数
5.1 题目描述
输入2个整数m和n,计算m和n的最大公约数,并打印出结果。
测试:
输入:18 24
输出:6
测试2:
输入: 17 3
输出:1
5.2 解法思路:
最⼤公约数是指两个或多个整数共有约数中最⼤的⼀个。为了求出两个数的最⼤公约数,可以采⽤枚举试除法。
- 具体来说,公约数⼀定⼩于两个数,从两个数中的较⼩值开始枚举;
- 从⼤到⼩依次判断能否同时整除这两个数,若某个数满⾜同时整除两个数,则其为公约数;
- 从⼤到⼩遍历找到公约数时,此数即为最⼤公约数,此时应当结束循环。
• 辗转相除法:
辗转相除法也称为欧⼏⾥得算法,是⼀种⽤来求两个正整数最⼤公约数的⽅法。它基于⼀个简单的数学原理:如果 a 和 b 是两个正整数,且 a>b ,则a和b的最⼤公约数等于 b 和 a%b ( a 除以 b所得的余数)的最⼤公约数。
具体的,辗转相除法的步骤如下:
- 如果 a<b ,将 a 和 b 交换。
- ⽤ a 除以 b ,得到商 q 和余数 r ,即 a=bq+r 。
- 如果 r 等于0,则 b 就是最⼤公约数。
- 如果 r 不等于0,则再⽤ b 除以 r ,得到商 q1 和余数 r1 ,即 b=rq1+r1 。
- 重复步骤3和步骤4,直到余数等于0为⽌。
- 最后的除数就是两个数的最⼤公约数。
假设我们已经知道a和b的最⼤公约数为 d ,即 d 是 a 和 b 的公约数,那么根据带余除法, a = bq + r ,那么 d 也是 b 和 r 的公约数,因为 d 能整除 a 和 b ,所以 d 也能整除 a - bq ,即 d 也能整除 r 。
最后,通过数学归纳法证明,在辗转相除的过程中,每次都将较⼤的数除以较⼩的数取余数,余数⽐上⼀轮操作的被除数⼩,最终余数为0时,较⼩的数就是 a 和 b 的最⼤公约数。因此,辗转相除法
能够正确地求出 a 和 b 的最⼤公约数。
5.3 解法代码
//⽅法1:
#include <stdio.h>
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
//计算找出m和n的较⼩值k
//因为最⼤公约数最⼤是m和n的较⼩值
int k = (m > n ? n : m);
while (1)
{
//每次拿k试除m和n,如果不能同时整除,则k--,继续试除
if (m % k == 0 && n % k == 0)
{
break;
}
//k的值减⼀,对下⼀个数进⾏判断
k--;
}
printf("%d\n", k);
return 0;
}
//⽅法2
#include <stdio.h>
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);//18 24
//辗转相除法
int k = 0;
//当n不能整除m,即k≠0,更新两个最值重复步骤计算n与m%n的最⼤公约数
while (k = m % n)
{
m = n;
n = k;
}
printf("%d\n", n);
return 0;
}
//辗转相除法递归实现 gcd(a,b)的结果为a和b的最⼤公约数
int gcd(int a, int b) {
//特判除数为0时的情况
if (b == 0) {
return a;
}
//返回b和a%b的最⼤公约数
return gcd(b, a % b);
}
5.4 运行结果