c语言求两个数的最大公因数(穷举法,欧几里得算法,递归)

/*主函数Gcd为求公因数的函数输入为负时返回-1*/

int main()
{
  int a, b;
  printf("Input a,b:");
  scanf("%d,%d",&a,&b);
  if (a < 0 || b < 0)
   printf("Input number should be positive!\n");
  else
   printf("Greatest Common Divisor of %d and %d is %d\n",a,b,Gcd(a,b));
  return 0;
}

/*穷举法一(欧几里得)*/

int Gcd(int a,int b)

{

  int i,t;

  if(a<=0 || b<=0)

  return -1;

  t=a<b ? a : b;

  for(i=t;i>0;i--)

  {

    if(a%i==0 && b%i==0)return i;

  }

  return 1;

}

/*穷举法二*/

int Gcd(int a,int b)

{

  int r;

  if(a<=0 || b<=0)

  return -1;

  do

  {

    r=a%b;

    a=b;

    b=r;

  }while(r!=0);

  return a;

}

/*递归一*/

int Gcd(int a,int b)

{

  if(a<=0 || b<=0)

    return -1;

  if(a%b==0)

    return b;

  else

    return Gcd(b,a%b);

}

/*递归二*/int Gcd(int a, int b)

  if (a <= 0 || b <= 0)
    return -1;
  while (a != b)
  { 
    if (a > b)
       a = a - b;
    else if (b > a)
       b = b - a;
  }
 return a;
}

/*递归二是根据公因数的如下性质:
根据最大公约数的如下3条性质,采用递归法编写计算最大公约数的函数Gcd(),
在主函数中调用该函数计算并输出从键盘任意输入的两正整数的最大公约数。
性质1  如果a>b,则a和b与a-b和b的最大公约数相同,即Gcd(a, b) = Gcd(a-b, b)
性质2  如果b>a,则a和b与a和b-a的最大公约数相同,即Gcd(a, b) = Gcd(a, b-a)
性质3  如果a=b,则a和b的最大公约数与a值和b值相同,即Gcd(a, b) = a = b

*/

时间: 2024-10-17 05:22:41

c语言求两个数的最大公因数(穷举法,欧几里得算法,递归)的相关文章

求两个数的最大公因数

这里提供两种方法:一种比较朴素,基本思想很简单就是按照从大到小的找能够匹配的因数,找到就返回:另一种是欧几里得算法,该算法的核心思想是,当前两个数的最大公因数的也是这两个数模的与其中一个元素的的最大公因数,然后递归算出.当两个数的模等于0时,则找到了最大公因数. 第一种:朴素的算法 算法思想:基本思想很简单就是按照从大到小的找能够匹配的因数,找到就返回: 时间复杂度:O(n) 代码(Java实现): 1 package Gcd; 2 /* 3 * 求两个数的最大公因数的朴素算法. 4 */ 5

C语言求两个数中最大公约数

在C语言中如何求两个数的最大公约数呢?下面用三种方法进行求解. 方法一:穷举法. 先比较两个数的大小,然后找出较小数t,最后判断t为何值时两个数都能整除,此方法效率较低. 代码如下: #include<stdio.h> int main() {      int num1,num2,temp,i;      scanf("%d%d",&num1,&num2);      if(num1>num2)      {            temp=num1

C语言--求两个数的最大公约数

问题: 求两个数的最大公约数 #include<stdio.h> #include<math.h>  main() { int a,b,c,i,j; printf("请输入三个数(数以逗号隔开):\n"); int arr[3]; int t; scanf_s("%d,%d,%d", &a,&b,&c); arr[0] = a;  arr[1] = b;  arr[2] = c; for (j = 0; j < 

c语言求两个数的最大公约数和最小公倍数

#include <stdio.h> int main() { // 两个数的最大公约数求法:最大公约数是这两个数之间公共最大的约数,我们可以先找到这两个数的比较小的数: int num1, num2, gys, gbs; scanf("%d,%d", &num1, &num2); int ji = num2*num1; if (num1>num2) { // 找到两个数较小的数 int temp; temp = num1; num1 = num2;

求两个数的最大公约数和最小公倍数 C语言

C程序设计第八章的第一道题目,求两个数的最大公约数和最小公倍数.需要注意一下几点: 1.最大公约数和最小公倍数间的关系: 设两个数是a,b最大公约数是p,最小公倍数是q 那么有这样的关系:ab=pq 所以q=ab/p.2.任意整数和0的公约数是该整数的所有约数,所以它们的最大公约数为该整数本身.3.碾转相除法:被除数%除数=余数,如果余数不为0,就让原来的除数做为被除数,余数作为除数,再进行运算 被除数%除数=余数,直到得到的余数为0为止,此时的除数就是最大公约数. #include <stdi

c语言:求两个数的最大公约数。

求两个数的最大公约数. 程序: #include <stdio.h> int main() { int num1, num2, t; printf("请输入两个正整数:"); scanf("%d%d",&num1, &num2);//7,8 while (t = num1%num2)//7           1        0,循环结束 { num1 = num2;     //8           7 num2 = t;     

【c语言】求两个数中不同的位的个数

// 求两个数中不同的位的个数 #include <stdio.h> int dcount(int a,int b) { int count = 0; int num = a ^ b; while (num) { count++; num = num & (num - 1); } return count; } int main() { printf("%d\n", dcount(3, 5)); return 0; } 版权声明:本文为博主原创文章,未经博主允许不得

编写C语言程序求两个数的最大公约数

//求两个数的最大公约数 #include <stdio.h> int main() {  int num1,num2;  int temp;  scanf("%d%d",&num1,&num2);  //核心算法  while(num1 % num2 != 0)  {   temp = num2;   num2 = num1%num2;   num1 = temp;  }  printf("最大公约数为:%d\n",num2);  re

【c语言】求两个数m和n的最大公约数(辗转相除法)

// 求两个数m和n的最大公约数(辗转相除法) #include <stdio.h> int yue( int x, int y ) { int temp; int tem; // 保证分母不为0 if( y == 0 ) { x = temp; temp = y; y = x; } // 辗转相除法 while( tem ) { tem = x % y; x = y; y = tem; } return x; } int main() { int a,b; printf("请输入要