C语言题目解析(一)

2023-10-31

1. 打印 1~100之间的奇数

1.1 题目描述

使⽤C语⾔写⼀个程序打印 1~100之间的奇数,要求输出的数字中间加上空格

1.2 解法思路

整数中,能被2整除的数是偶数,不能被 2 整除的数是奇数,奇数的个位为 1,3,5,7,9。对于
1~100 之间的奇数,我们可以进⾏如下操作:

  1. 利⽤循环语句 for 从 1 开始迭代到 100;
  2. 使⽤条件语句 if 来检查每个数字是否为奇数(即除以 2 余数不为 0 );
  3. 如果数字是奇数,则我们使⽤ printf 函数将其打印到控制台上,并在数字之间添加⼀个空
    格;
  4. 最后,我们在 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 循环来迭代⾏和列。

  1. 在外部循环中,我们⽤i迭代⾏号,从19,表⽰乘法表中的第i⾏;
  2. 在内部循环中,我们⽤j迭代列号,从1i ,表⽰第i⾏中的第j列;
  3. 然后使⽤printf函数打印出每⼀项,包括被两个因数和乘积,它们⽤空格隔开,并且使⽤%2d格式控制符将乘积左对⻬输出,使得每个乘积占两个字符宽度;
  4. 在打印完每⼀⾏后,需要继续打印⼀个\n,表⽰当前⾏遍历结束,开始下⼀⾏的打印
  5. 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。
如果组成了三⻆形,再判断是什么三⻆形,有三种情况:

  1. 等边三⻆形:三边相等;
  2. 等腰三⻆形:两边相等,但不等于第三边;
  3. 普通三⻆形:三边不相等。
    最后,如果输⼊的三个数不能组成三⻆形,则输出“注意:不能构成合法三角形”
    在这里插入图片描述

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 解法思路:

最⼤公约数是指两个或多个整数共有约数中最⼤的⼀个。为了求出两个数的最⼤公约数,可以采⽤枚举试除法。

  1. 具体来说,公约数⼀定⼩于两个数,从两个数中的较⼩值开始枚举;
  2. 从⼤到⼩依次判断能否同时整除这两个数,若某个数满⾜同时整除两个数,则其为公约数;
  3. 从⼤到⼩遍历找到公约数时,此数即为最⼤公约数,此时应当结束循环。
    • 辗转相除法:
    辗转相除法也称为欧⼏⾥得算法,是⼀种⽤来求两个正整数最⼤公约数的⽅法。它基于⼀个简单的数学原理:如果 a 和 b 是两个正整数,且 a>b ,则a和b的最⼤公约数等于 b 和 a%b ( a 除以 b所得的余数)的最⼤公约数。
    具体的,辗转相除法的步骤如下:
    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. 最后的除数就是两个数的最⼤公约数。
      假设我们已经知道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 运行结果

请添加图片描述
请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言题目解析(一) 的相关文章

随机推荐

  • 国庆在家写了个简易版的在线简历网站

    一个可在线编辑的简历页面 放在github Page上托管 在线编辑 可生成PDF 从此跑路没烦恼 目录 一 GitHub Page托管简历 二 修改简历 三 简历下载 一 GitHub Page托管 1 页面样式 这个简历单纯页面技术含量
  • tcpclient和tcplistener通信

    服务器和客户端的代码都在在vs中编写并运行的 功能上实现了一个客户端和服务器互发消息 如果哪位大神知道多个客户端怎么搞 请留个思路给我 感谢 服务器的代码 using System using System Collections Gene
  • Git commit格式 详解

    我们在使用git进行版本控制的时候 commit的格式是有要求的 我们可以先去看一些顶级项目他们的commit的格式是怎样的 angular在github上的commit信息 我们可以发现 commit都有一些前缀 比如说 feat tes
  • VRTK简要说明

    1 导入VRTK开发包 下方三个为基础控件 用于识别硬件设备以及相关配置 2 移动功能简介 3 ui交互事件 将VRTK UICanvas 组件添加到Canvas下可用ui所有事件 1 问题容易出现ui穿透 所以在做的时候要防止穿透 最好不
  • sqli-labs通关大全(更新至Less60)

    sqli labs通关 less1 less10 箭雨镜屋 CSDN博客 sqli labs通关 less11 less20 箭雨镜屋 CSDN博客 sqli labs通关 less21 less30 箭雨镜屋 CSDN博客 sqli la
  • config:fail,Error: 系统错误,错误码:63002,invalid signature

    经过半天的尝试 终于把这个解决了 本文章比较是和 前端用 hash分享下这个问题吧 看了好多文章都没解决了我的问题 直接上干货 1 首先出一张基本的问题图 2 针对上面这个图第2点内 hash 做个讲解 因为我前端用的 hash模式 一般网
  • 编码之Base64编码

    Base64编码 是一种基于 64 个可打印字符来表示二进制数据的方法 目前 Base64 已经成为网络上常见的传输 8 位二进制字节代码的编码方式之一 为什么会有 Base64 编码呢 因为有些网络传送渠道并不支持所有的字节 例如 传统的
  • 【Xilinx AX7103 MicroBalze学习笔记2】MicroBlaze 串口发送 Hello World 实验

    目录 实验介绍 硬件设计 Vivado部分 创建工程 搭建Block Design MicroBlaze部分 外围模块部分 时钟模块 Uart部分 管脚绑定 时钟约束 生成Bit流文件 软件设计 SDK部分 板级验证 总结 往期系列博客 实
  • stm32无人机-飞行力学原理

    惯性导航 是一种无源导航 不需要向外部辐射或接收信号源 就能自主进行确定自己在什么地方的一种导航方法 惯性导航主要由惯性器件计算实现 惯性器件包括陀螺仪和加速度计 一般来说 惯性器件与导航物体固连 加速度计测量物体运动的加速度 已知初始状态
  • Java分治算法经典案例之汉诺塔

    分治算法 思想 当我们求解某些问题时 由于这些问题要处理的数据相当多 或求解过程相当复杂 使得直接求解法在时间上相当长 或者根本无法直接求出 对于这类问题 我们往往先把它分解成几个子问题 找到求出这几个子问题的解法后 再找到合适的方法 把它
  • Unable to install “xxx“

    Unable to install xxx Xcode Could not inspect the application package macOS Version 11 4 Build 20F71 Xcode 12 5 1 18212
  • Ubuntu终端使用todesk命令

    Ubuntu终端使用todesk命令 todesk是一款免费的远程控制软件 支持Windows Linux Mac Android iOS等多种平台 可以实现跨设备的远程控制 文件传输 远程打印等功能 本文将介绍如何在Ubuntu终端使用t
  • matlab求图像杰卡德系数,Jaccard similarity coefficient for image segmentation

    This example shows how to segment an image into multiple regions The example then computes the Jaccard similarity coeffi
  • 免费的云服务器,大家推荐哪个呢?

    搭建一个云平台的成本还是很高的 但是就没有企业免费为公众提供服务的吗 其实免费的服务器是有的 各大平台都有 阿里云 腾讯云都有 只是受时间限制的 大多数是7天或者15天 但是某丰云却号称是永久免费的 其实它是有前提的 释放以后的数据也就永远
  • 第一课:使用C++实现图片去水印

    目录 1 功能概述 2 具体实现 2 1 导入OpenCV库和头文件 2 2 读入图像并显示 2 3 提取水印区域 2 4 重构去除水印后的图像 3 完整代码如下 4 实现效果 5 介绍几种PS去水印的方法 5 1 裁剪法 5 2 借图法
  • c1047: [编程入门]报数问题[报3退出]

    有n人围成一圈 顺序排号 从第1个人开始报数 从1到3报数 凡报到3的人退出圈子 问最后留下的是原来的第几号的那位 输入 初始人数n 输出 最后一人的初始编号 样例输入复制 3 样例输出复制 2 思路 约瑟夫环问题 需要考虑 1 成环 即当
  • 2023年软件测试常见面试题100%问必背全套教程

    随着数字化时代的到来 软件测试越来越受到重视 在未来的几年里 软件测试将继续成为信息技术领域中的热门职业之一 如果你是一名正在寻找或准备进入软件测试行业的人 那么这套常见面试题全套教程对你来说会非常有用 这套教程旨在帮助你了解2023年软件
  • Hdfs页面操作文件出现 Permission denied: user=dr.who, access=WRITE, inode=“/“:hadoop:supergroup:drwxr-xr问题解决

    错误描述 Permission denied user dr who access WRITE inode hadoop supergroup drwxr xr x 先开始一直纠结我是用hadoop用户登录操作的 为什么会是dr who d
  • eNSP之安全策略的配置

    命令行模式 FW firewall zone trust 进入trust区域 FW zone trust add int g1 0 0 把g1 0 0加入trust区域 undo add int g1 0 0 取消加入 FW firewal
  • C语言题目解析(一)

    C语言题目解析 1 打印 1 100之间的奇数 1 1 题目描述 1 2 解法思路 1 3 代码 1 4 运行结果 2 打印9 9乘法 诀表 2 1 题目描述 2 2 解题思路 2 3 解法代码 2 4 运行结果 3 打印素数 3 1 题目