当前位置:网站首页>C语言-6月8日-求两个数的最小公倍数和最大公因数;判断一个数是否为完数,且打印出它的因子
C语言-6月8日-求两个数的最小公倍数和最大公因数;判断一个数是否为完数,且打印出它的因子
2022-08-11 05:30:00 【曾铎000811】
目录
方法三:利用递归的方式来解决(本质上是辗转相除法代码调用自身):
一个数如果恰好等于它的因子之和,这个数就被称为“完数”,例如,6的因子为1,2,3,而1+2+3刚好等于6,因此6是完数,编写程序找出1000以内所有的完数,并按照下面的格式输出其因子:6 It's factor are 1,2,3:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int num,sum,i;//定义整形值
for(num = 2;num < 1000;num++)//从2~1000开始循环
{
sum = 0;//初始化sum的值为0
for(i = 1;i < num;i++)//定义第二层循环,方便下面的取余操作用来判断是否为因子
{
if(num % i == 0)//取余为零的情况下
{
sum = sum + i;//对每个因子进行累加
}
}
if(sum == num)//当因子的和刚好等于num值本身的时候
{
printf("%dIt's factor are:\n",num);//打印num值
for(i = 1;i < num;i++)//开启i循环
{
if(num % i == 0)//如果这个数为因子的话
{
printf("%d ",i);//将因子打印
}
}
printf("\n");//换行操作
}
}
return 0;
}如图所示为输出结果:

输出完成
求两个数的最小公倍数和最大公因数:
第一种方法:运用三目运算符和取余循环
分析题目,定义两个整型值分别为max和min,首先判断这两个数谁大谁小,最大公约数可以理解为两个数字都对同一个数字取余为零,而最大公倍数可以理解为从数字1开始一直尝试与两个数中的最小值乘积不断的对最大值取余,取余结果如果0,则代表成功时的数字和最小值的乘机则为两个数字的最小公倍数。分析完成,将思路代码化:
#include<stdio.h>
int main()
{
int num1 = 15;
int num2 = 25;
int max = num1 >= num2 ? num1 : num2;
int min = num1 <= num2 ? num1 : num2;//利用三目运算符来判断num1和num2值谁大谁小,并分别将大小值赋给max和min。
for(int i =min;i > 0;i--)
{
if(num1 % i == 0 && num2 % i == 0){ //如果num1和num2均对i取余为零的话,那么i值就是这两个数的最大公约数
printf("最大公约数为:%d\n",i);
}
}
for(int i = 1;i <= num2 ;i++)
{
if(i * min % max == 0){ //如果i与num1和num2中的最小值的乘积对最大值取余为零的话,那么这个乘机就是这两个数的最小公倍数。
printf("最小公倍数为:%d\n",i*num1);
break;//找到最小公倍数后跳出循环
}
}
return 0;
}输出完成
如图为运行结果:

输出完成
第二种方法:利用辗转相除法算法
首先要知道一个数学规律:已知两个数,已经求得这两个数的最大公约数,那么这两个数的乘积除以最大公约数就是这两个数的最小公倍数。也就是说题目要求求最大公约数和最小公倍数,我们只需要求出最大公约数问题就变的简单多了。
下面来分析辗转相除法算法:
定义两个整型值a,b,如果a对b取余直接为0,那么我们就可以断定b就是a,b两数的最大公约数,这是第一种情况。
如果a对b取余不为0,则需要将a取余b的值赋给新定义的整型值c,再将b的值赋给a,然后再将c的值赋给b,重新返回取余前的步骤,实现循环,如果a取余b还不等于0的话,持续执行此操作,直到a取余b的值为零,此时c的值就是a,b两数的最大公约数,后通过两数乘积除以最大公约数,即可求出最小公倍数。
我们举个例子:假设a的值为25,b的值为15,运用辗转相除法算法来执行的步骤如下:
第一次循环:a%b -> 25%15=10;a=b -> a=15; b=c -> b =10;
第二次循环:a%b -> 15%10=5; a=b -> a=10; b=c -> b=5;
第三次循环:a%b -> 10%5=0 -->最终取余结果为零,表示5为a,b两数的最大公因数。
算法试数分析完成,将思路代码化:
#include<stdio.h>
int main()
{
int num1 = 25;
int num2 = 15;//定义两个整型值
int mul = num1 * num2;//定义两个数的乘积
int temp;//定义取余值中间变量
while (num1 % num2 != 0)//循环条件:当num1对nun2取余不为0时
{
temp = num1 % num2;
num1 = num2;
num2 = temp;//辗转相除算法,如果不明白请看上面的算法分析以及试数
}
printf("最大公约数是:%d\n",num2);
printf("最小公倍数是:%d\n",mul/num2);//输出最大公约数和最小公倍数
return 0;
}
如图所示,运行结果:

输出完成
程序执行成功,输出结果正确。
方法三:利用递归的方式来解决(本质上是辗转相除法代码调用自身):
#include<stdio.h>
int gcd(int x,int y)
{
return(!y)? x :gcd(y, x % y);//递归写法:通过!y来判断y是否等于0,如果y不等于0,持续执行语句x:gcd(y,x%y),当y等于0时进行输出。
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d",&a,&b);
printf("最大公约数是:%d\n",gcd(a,b));
return 0;
}如图:我输入数字15和25:

输出完成
边栏推荐
- gerrit configure SSH Key and account, email information
- 星盟-pwn-fog
- 贡献者任务第三期精彩来袭
- OpenMLDB Pulsar Connector: Efficiently connect real-time data to feature engineering
- swagger常用注释API @ApiModel、@ApiModelProperty的用法
- The official website of OpenMLDB is upgraded, and the mysterious contributor map will take you to advance quickly
- 活动预告 | 4月23日,多场OpenMLDB精彩分享来袭,不负周末好时光
- Jetpack's dataBinding
- PyQt5中调用.ui转换的.py文件代码解释
- [Meetup Preview] OpenMLDB+OneFlow: Link feature engineering to model training to accelerate machine learning model development
猜你喜欢
随机推荐
本地服务配置内网穿透实现微信公众号整合
C语言实现三子棋(代码详解)
OpenMLDB Pulsar Connector: Efficiently connect real-time data to feature engineering
轻松理解进程与线程
Interpretation of the paper: Cross-Modality Fusion Transformer for Multispectral Object Detection
编译异常解决
JS小技巧,让你编码效率杠杠的,快乐摸鱼
C-自定义类型(结构体、枚举、联合)
helm安装
OpenMLDB v0.5.0 released | Performance, cost, flexibility reach new heights
Certificate of SearchGuard configuration
JS案例练习(pink老师经典案例)
JVM tuning and finishing
Real-time Feature Computing Platform Architecture Methodology and Practice Based on OpenMLDB
JNI入门
第一章 Verilog语言和Vivado初步使用
mysql basic summary
Jetpack use exception problem collection
父子节点数据格式不一致的树状列表实现
深度学习Matlab工具箱代码注释









