当前位置:网站首页>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:​​​​​​​​​​​​​​

求两个数的最小公倍数和最大公因数:

第一种方法:运用三目运算符和取余循环

如图为运行结果:

第二种方法:利用辗转相除法算法

算法试数分析完成,将思路代码化:

方法三:利用递归的方式来解决(本质上是辗转相除法代码调用自身):


一个数如果恰好等于它的因子之和,这个数就被称为“完数”,例如,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:

输出完成 

原网站

版权声明
本文为[曾铎000811]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_45571585/article/details/125201121