C语言-6月8日-求两个数的最小公倍数和最大公因数;判断一个数是否为完数,且打印出它的因子
目录
方法三:利用递归的方式来解决(本质上是辗转相除法代码调用自身):
一个数如果恰好等于它的因子之和,这个数就被称为“完数”,例如,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:
输出完成
相关文章
- 计算机等级考试二级C语言程序设计专项训练题——程序设计题(一)
- C语言程序设计100例之(19):欢乐的跳
- C语言集成开发环境使用小记
- C语言常见的习题
- 《C语言开发从入门到精通》一第2章 C语言开发工具详解2.1 用DOS开发C程序
- 基于Python实现一个C语言的编译器【100010711】
- C语言:结构体
- C语言:sizeof和strlen计算有关数组字节大小
- 【C语言】编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。
- 【C语言】输入一个N阶矩阵,将其转置后输出。利用指针
- 《C语言编程魔法书:基于C11标准》——1.5 用C语言构建一个可执行程序的流程
- 《C语言编程魔法书:基于C11标准》——2.3 浮点数在计算机中的表示
- 使用pybind11为Python编写一个简单的C语言扩展模块
- (第20列)C语言典型列题:分解一个不多于五位的数字,分别打印各位数并且判断是几位数。
- (第二列)C语言常见基础题型,确定不看一下?:给一个考试分数判断等级(三种解法)。
- (第一列)C语言常见基础题型,确定不看一下?:找完数---- {一个关键点三种写法}。
- C语言中volatile关键字的作用
- 在VS2010下开发C语言程序
- C语言-字符串-指针-排序
- C语言基本语法入门练习题
- C语言实现惯导参数的初始化
- 【源代码】将一个整数的每位数分解并按逆序放入一个数组中(用递归算法)(C语言实现)
- C语言的一个关键字——static
- C语言-----输出一个数的各数之和(递归)