C语言经典100题 1-5


前言

题目素材来源于比特鹏哥精选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
此题与打印图形题类似,需要使用双层循环来实现,外层循环遍历行,内层循环遍历列

  1. 在外部循环中,我们⽤ i 迭代⾏号,从 1 到 9 ,表⽰乘法表中的第 i ⾏;
  2. 在内部循环中,我们⽤ 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成立,执行2
1=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。
如果组成了三⻆形,再判断是什么三⻆形,有三种情况:

  1. 等边三⻆形:三边相等;
  2. 等腰三⻆形:两边相等,但不等于第三边;
  3. 普通三⻆形:三边不相等。
    最后,如果输⼊的三个数不能组成三⻆形,则输出“⾮三⻆形”。
    一定要注意顺序
    错解
#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为最大公约数

  1. 具体来说,公约数⼀定⼩于两个数,从两个数中的较⼩值开始枚举;
  2. 从⼤到⼩依次判断能否同时整除这两个数,若某个数满⾜同时整除两个数,则其为公约数;
  3. 从⼤到⼩遍历找到公约数时,此数即为最⼤公约数,此时应当结束循环。

在这里插入图片描述
法2:辗转相除法

  1. 如果 a<b ,将 a 和 b 交换。
  2. ⽤ a 除以 b ,得到商 q 和余数 r ,即 a=bq+r 。
  3. 如果 r 等于0,则 b 就是最⼤公约数。
  4. 如果 r 不等于0,则再⽤ b 除以 r ,得到商 q1 和余数 r1 ,即 b=rq1+r1 。
  5. 重复步骤3和步骤4,直到余数等于0为⽌。
  6. 最后的除数就是两个数的最⼤公公约数。
    核心代码
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;
 }

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值