前言
题目素材来源于比特鹏哥精选100题,每题都是超详解,如有错误或者更好的解法欢迎评论区留言😊💕
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目1
打印1~100之间的奇数
题目描述
使用C语言写⼀个程序打印 1~100之间的奇数,要求输出的数字中间加上空格。
题目2
打印9*9乘法⼝诀表
题目描述
使⽤C语⾔写⼀个程序打印9*9乘法⼝诀表,如下图

题目3
打印素数
题目描述
使⽤C语⾔写⼀个程序打印100~200之间的素数,数字中间使⽤空格分割。
题目4
判断三⻆形
题目描述
输⼊三个整数a,b,c,判断由a,b,c作为三条边组成的三⻆形,如果不能组成三⻆形则输出:⾮三⻆
形;如果是三⻆形,再继续判断,如果是等边三⻆形,则输出:等边三⻆形;如果是等腰三⻆形,则
输出:等腰三⻆形;否则输出普通三⻆形。
题目5
计算最⼤公约数
题目描述
输⼊2个整数m和n,计算m和n的最⼤公约数,并打印出结果。
二,解题思路
分析题目1
题目要求是奇数,奇数不能被二整除,C语言判断奇数一般有以下几种方法
法一:取模运算
if (num % 2 == 1) {
printf("%d是奇数\n", num);
}
取模运算的两个操作数必须为整数,余数符号与被除数的符号相同
注意
if (num / 2 != 0) {
printf("%d是奇数\n", num);
}
这个方法是错误的!在C语言中,整数/整数是一个整数,会舍去小数部分值。例如5/2=2;但当操作数中只要有一个为实型数据,结果就为double型,例如5.0/2=2.5
法二 使用位与运算符
if (num & 1) {
printf("%d是奇数\n", num);
}
通过位与运算符(&)检查最低位是否为1。如果最低位为1,则该数为奇数。
(num % 2 != 0) ? printf("%d是奇数\n", num) : printf("%d不是奇数\n", num);
通过条件表达式直接判断数值是否为奇数,适用于简单的逻辑判断。
分析题目2
解题步骤
1.使用for循环遍历1~100
2.使用条件语句 if 来检查每个数字是否为奇数(即除以 2 余数不为 0 )——判断奇数
3.如果数字是奇数,则我们使⽤ printf 函数将其打印到控制台上,并在数字之间添加⼀个空格
//打印⼀个换⾏符,进⾏下⼀⾏的打印## 分析题目2
此题与打印图形题类似,需要使用双层循环来实现,外层循环遍历行,内层循环遍历列
- 在外部循环中,我们⽤ i 迭代⾏号,从 1 到 9 ,表⽰乘法表中的第 i ⾏;
- 在内部循环中,我们⽤ j 迭代列号,从 1 到 i ,表⽰第 i ⾏中的第 j 列;
核心代码
for (i = 1; i <= 9; i++)
{
//每⼀⾏打印⼏项
for (j = 1; j <= i; j++)
{
//打印当前的乘法公式
printf("%d*%d=%2d ", i, j, i * j);
}
//打印⼀个换⾏符,进⾏下⼀⾏的打印
printf("\n");
}
第一次循环
当i=1时,1<=9成立,进入内层循环
j=1,1<=1成立,进入循环体11=1;j++,j为2,2<=1不成立跳出内层循环,执行i++,i=2
第2次循环
i=2,2<=9成立,进入内层循环,j=1,j<=2成立,执行21=2,j++,j=2,j=2<=2成立,执行2*2=4,依此类推
分析题目3
素数的数学性质
素数是指大于1的自然数,除了1和它本身外没有其他正因数。数学性质包括:
1.素数只有两个正因数:1和它本身。
2.是唯一的偶素数,其他素数均为奇数。
3.素数的分布密度随数值增大而降低(素数定理)。
4.任何大于1的整数都可以表示为素数的乘积(算术基本定理)。
5.素数除了被1和自己本身整除外,不能被其他任何整数整除
例如:13是一个素数,它不能被2~12整除
则可以得到判断素数的方法:把m作被除数,把i=2~(m-1)依次作为除数,如果余数不为0,则表示不能整除,即该数为素数。
简洁法(最常用):m只需被2~√m范围内的每一个整数除
用C语言判断素数
错误方法
#include <stdio.h>
#include <math.h>
int main()
{
int m=0,k=0,i=0;
scanf("%d",&m);
k=(int)sqrt(m);
for(i=2;i<=k;i++){
if(m%i!=0){
printf("m是素数");
}
}
m%i !=0,浮点数%整数为语法错误
正确解法
#include <stdio.h>
#include <math.h>
int main()
{
int m = 0, k = 0, i = 0;
scanf_s("%d", &m);
// 处理特殊情况
if(m <= 1) {
printf("%d不是素数", m);
return 0;
}
k = (int)sqrt(m);
for(i = 2; i <= k; i++) {
if(m % i == 0) { // 只要找到一个能整除的
printf("%d不是素数", m);
return 0; // 立即结束程序
}
}
// 如果循环完整执行完都没找到能整除的
printf("%d是素数", m);
return 0;
}
分析题目4
三⻆形的判断⽅法是:对于三条边⻓a、b、c,若任意两边之和⼤于第三边,那么就可以组成⼀个三⻆形,即a+b>c, a+c>b, b+c>a。
如果组成了三⻆形,再判断是什么三⻆形,有三种情况:
- 等边三⻆形:三边相等;
- 等腰三⻆形:两边相等,但不等于第三边;
- 普通三⻆形:三边不相等。
最后,如果输⼊的三个数不能组成三⻆形,则输出“⾮三⻆形”。
一定要注意顺序
错解
#include <stdio.h>
int main() {
int a = 0,b = 0,c = 0;
scanf("%d %d %d", &a, &b, &c);
if (a + b > c && a + c > b && b + c > a) {
if (a == b || b == c || a == c) {
printf("等腰三角形\n");
}
else if (a == b && b == c) {
printf("等边三角形\n");
}
else {
printf("普通三角形\n");
}
}
else {
printf("非三角形\n");
}
return 0;
}

3 3 3显然是等边三角形,为什么显示是等腰三角形呢
注意注意😱😱
当前代码的逻辑流程:
首先检查a == b || b == c || a == c(任意两边相等)
然后才检查a == b && b == c(三边都相等)
当输入3 3 3时:
第一个条件a == b || b == c || a == c成立(因为确实有边相等)
程序直接进入第一个if块,输出"等腰三角形"
永远不会执行到检查等边三角形的else if条件
分析题目5
最大公约数的数学性质:
最⼤公约数是指两个或多个整数共有约数中最⼤的⼀个。
给定两个整数 a 和 b(不同时为0),假设最大公约数为d,若满足
a%d==0&&b%d==0
则d为最大公约数
- 具体来说,公约数⼀定⼩于两个数,从两个数中的较⼩值开始枚举;
- 从⼤到⼩依次判断能否同时整除这两个数,若某个数满⾜同时整除两个数,则其为公约数;
- 从⼤到⼩遍历找到公约数时,此数即为最⼤公约数,此时应当结束循环。

法2:辗转相除法
- 如果 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为⽌。
- 最后的除数就是两个数的最⼤公公约数。
核心代码
while (k = m % n)
{
m = n;
n = k;
}
初始状态
m = 18
n = 24
注意:虽然初始 m < n,但算法无需交换,因为下一步会自动调整。
第1次循环
计算余数 k:
k = m % n = 18 % 24
→ 18 除以 24 商 0 余 18(因为 18 < 24,直接余 18)
→ k = 18(非零,继续循环)
更新变量:
m = n = 24
n = k = 18
→ 现在 m = 24, n = 18
第2次循环
计算余数 k:
k = m % n = 24 % 18
→ 24 ÷ 18 = 1 余 6
→ k = 6(非零,继续循环)
更新变量:
m = n = 18
n = k = 6
→ 现在 m = 18, n = 6
第3次循环
计算余数 k:
k = m % n = 18 % 6
→ 18 ÷ 6 = 3 余 0
→ k = 0(循环终止)
退出循环时 n = 6,即 最大公约数为 6。
结果
题1
#include <stdio.h>
int main()
{
int i = 1;
for (i = 1;i <= 100;i++) {
if (i % 2 == 1) {
printf("%d ", i);
}
}
return 0;
}

法二,由于每个相邻的奇数,他们的差为 2,因此我们可以在 for 循环语句中迭代时只遍历奇数,省略了判断过程
#include <stdio.h>
int main()
{
int i = 0;
//for循环语句,将i初始化为1,当i不⼤于100时进⼊循环,i的值加⼆后继续判断进⼊循环的条件
for(i=1; i<=100; i+=2)
{
printf("%d ", i);
}
return 0;
}
题2
#include <stdio.h>
int main() {
int i, j = 0;
for (i = 1;i <= 9;i++) {
for (j = 1;j <= i;j++) {
printf("%d*%d=%2d ", i, j, i * j);
}
//打印⼀个换⾏符,进⾏下⼀⾏的打印
printf("\n");
}
return 0;
}
题3
法一:直解
#include <stdio.h>
int main() {
int i, j;
for (i = 100;i <= 200;i++) {
j = 1;
int flat = 1;
//如果flat的值没有改变,则说明没有i没有被2~i-1的值整除,i为素数
for (j = 2;j <= i - 1;j++) {
if (i % j == 0) {
flat = 0;
}
}
if (flat == 1) {
printf("%d ", i);
}
}
return 0;
}
优化
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
//素数没有偶数,偶数直接跳过
for (i = 101; i <= 200; i += 2)
{
int j = 0;
int flag = 1;
//遍历2~当前数的根号
for (j = 2; j <= sqrt(i); j++)
{
//存在⼀个数可以整除当前数
if (i % j == 0)
{
flag = 0;//不是素数
break;
}
}
if (flag == 1)//是素数就打印
printf("%d ", i);
}
return 0;
}

题4
#include <stdio.h>
int main() {
int a = 0, b = 0, c = 0;
scanf_s("%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 || b == c || a == c) { // 再检查等腰
printf("等腰三角形\n");
}
else {
printf("普通三角形\n");
}
}
else {
printf("非三角形\n");
}
return 0;
}

题5
方法一
#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;
}

4万+

被折叠的 条评论
为什么被折叠?



