求两个正整数m和n的最大公约数

供稿:hz-xin.com     日期:2025-01-13
C语言编程:输入两个正整数m和n,求它们的最大公约数。

代码及注释如下:
#include
int GCD(int a,int b)//定义函数,用来计算最大公约数
{
return b==0?a:GCD(b,a%b);
//此处使用了递归,如果b=0,返回a为最大公约数,否则,一直以b与a%b赋给函数,实现辗转相除
}
int main()
{
int a, b ; //定义实参a, b
int answer ; //定义最后结果
scanf ( "%d%d" , &a, &b) ; //取a,b的值
answer = GCD (a, b) ; //把结果赋给answer
printf ( "%d与%d的最大公约数为%d
" , a , b , answer ) ; //输出结果
}

扩展资料:
辗转相除法求最大公约数的原理:
因为对任意同时整除a和b的数u,有a=su,b=tu,它也能整除r,因为r=a-bq=su-qtu=(s-qt)u。
反过来每一个整除b和r的整数v,有 b=sv , r=tv,它也能整除a,因为a=bq+r=svq+tv=(sq+t)v。
因此a和b的每一个公因子同时也是b和r的一个公因子,反之亦然。
这样由于a和b的全体公因子集合与b和r的全体公因子集合相同,所以a和b的最大公因子必须等于b和r的最大公因子,这就证明了上边的等式。即(a,b)=(b,r)。
因而,可以由此,得到两个数的最大公约数。

#include
int main(){
int a,b,num1,num2,temp;
printf("please input two number:
");
scanf("%d%d",&num1,&num2);
if(num1<num2){
temp = num1;
num1 = num2;
num2 = temp;
}
a = num1;
b = num2;
while(b!=0){
temp = a%b;
a=b;
b=temp;
}
printf("gongyueshu:%d
",a);
printf("gongbeishu:%d
",num1*num2/a);
}

扩展资料:

C语言循环控制语句
一、while语句
1、计算while后面括号里表达式的值,若其结果非0,则转入2,否则转3
2、执行循环体,转1
3、退出循环,执行循环体下面的语句。
由于是先执行判断后执行循环体,所以循环体可能一次都不执行。
二、do...while语句
1、执行循环体,转2
2、计算while后面括号里表达式的值,若其结果非0,则转入1,否则转3
3、退出循环,执行循环体下面的语句。

求两个正整数的最大公约数的算法通常使用“辗转相除法”。设有两个正整数m、n,求它们的最大公约数的算法如下:
①若m<n,则交换m和n(保证m大于n)。
②计算m/n的余数r。
③若r不等于0,则令m=n、n=r,转第②步继续执行;
否则,算法结束,n就是最大公约数。
下面就是用“辗转相除法'才出并返回m、n最大公约数的函数fmn(),请填写清单中缺少的语句。
int fmn( m, n)
int m, n;
{ int r;
if(m<n )
{r=m;m=n;n=r;}
if(n==0)
return(m);
do{_________________
if(r!= 0)
{ m=n; n=r;}
}while(r!=0);
return(n);
}
【分析】由于算法步骤已经给出,按照算法来理解程序就比较简单。函数体开始的单分支语
句是确保m值是大于n值的。接下来的单分支语句是确保算法中的除法“m/n”时的除数n不为0。注意,如果一开始的n就是O,则两个最大公约数就是m,此处利用返回语句返回的函数值就是m。接下来的do-while循环是实现算法步骤中的第②步和第③步的,显然该循环体中的第2条单分支语句是完成算法步骤中的第③步工作的,而空白处应该完成算法步骤中的第②步工作,即r等于m/n的余数。
【答案】r=m%n;
【说明】求最大公约数和最小公倍数的算法是常用算法;但在教材中并没有给出,希望读者在
学有余力的情况下,能掌握这两个算法。
求两个正整数的最小公倍数的算法在教材中也没有给出,下面给出求最小公倍数的一种算法。设有两个正整数m、n,求它们的最小公倍数的算法如下:
①若m<n,则交换m和n(保证m大于n)。
②令d=m。
③若d能被n整除,则算法结束,d就是m和n的最小公倍数。
否则,令d=d+m,转第③步,继续执行。
实现算法的程序清单如下:
main()
{ int m, n, d ;
scanf("%d,%d",&m,&n);
if(m<n)
{ d=m;m=n;n=d;}
if(n==0)
d=0;
else
{ d=m;
while(d%n!=0)
d+=m;
}
printf(”%d\n”,d);
}

1.转转相除法:例如:求8251与6105的最大公约数
解:8251=6105*1+2146
6105=2146*2+1813
2146=1813*1+333
1813=333*5+148
333=148*2+37
148=37*4
所以最大公约数为37
2.更相减损术:例如:求98与63的最大公约数
解:98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
所以最大公约数为7

#include <stdio.h>
#include <stdlib.h>

int x1(int m,int n)
{

return m%n==0?n:(n,m%n);

}
int x (int m,int n)
{
if(m<0)
m=-m;
if (n<0)
n=-n;
return n==0?m:x1(m,n);
}
int main()
{
int m,n;

printf("请输入m,n:");
scanf("%d%d",&m, &n);

printf("最大公约数是�%d\n",x(m,n));
return 0;
}

辗转相除 祥见高等代数第一章

用辗转相除法

输入两个正整数M,N,写一个程序计算其最大公约数。
这是一个计算两个正整数最大公约数的程序示例。程序首先要求用户输入两个整数M和N,然后通过一个循环寻找满足条件的最大公约数。程序中的关键步骤包括:初始化变量t和a,通过循环遍历从1到M和N之间的所有数,检查每个数是否同时是M和N的余数,如果是,则将其赋值给a。循环结束后,a即为M和N的最...

2、 输入两个正整数m 和n,求它们的最大公约数和最小公倍数。
求最大公约数用辗转相除法,最小公倍数为m*n\/最大公约数

输入两个正整数m和n,求其中最大公约数和最小公倍数。不要代码,用自然语...
① 得到输出m,n ② 辗转相除法求出m,n的最小公倍数a;③ 最大公约数为m*n\/a 其实就这么简单撒~

求两个正整数的最大公约数,用算法怎么表示
在“求两个正整数的最大公约数”问题的算法的问题解决中,除了辗转相除求最大公约数和更相减损之术,是否还有其它的算法。辗转相除求最大公约数:假设求两个正整数m和n的最大公约数。以下是辗转的算法:分别用m,n,r表示被除数、除数、余数 ①若m<n,则交换m和n 的值 ②求m除以n的余数r.③...

.输入两个正整数m和n,求其最大公约数和最小公倍数。这个程序怎么编啊...
输入两个正整数m和n, 求其最大公约数和最小公倍数.<1> 用辗转相除法求最大公约数 算法描述:m对n求余为a, 若a不等于0 则 m <- n, n <- a, 继续求余 否则 n 为最大公约数 <2> 最小公倍数 = 两个数的积 \/ 最大公约数 include <stdio.h> int main(){ int m, n;int m_...

用流程图表示两个正整数m和n的大公约数和最小公倍数,
一般采用辗转相除法求最大公约数h。最小公倍数=m*n\/h

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。用C语言编程
输入两个正整数m和n, 求其最大公约数和最小公倍数.<1> 用辗转相除法求最大公约数 算法描述:m对n求余为a, 若a不等于0 则 m <- n, n <- a, 继续求余 否则 n 为最大公约数 <2> 最小公倍数 = 两个数的积 \/ 最大公约数 include int main(){ int m, n;int m_cup, n_cup...

C语言:输入两个正整数m和n,求其最大公约数和最小公倍数。
不完全啊 回答: <1> 用辗转相除法求最大公约数算法描述:m对n求余为a, 若a不等于0则m <- n, n <- a, 继续求余否则n 为最大公约数<2> 最小公倍数 = 两个数的积 \/ 最大公约数#includeint main(){int m, n;int m_cup, n_cup, res; \/*被除数, 除数, 余数*\/printf("Enter...

输入两个正整数m和n,求其最大公约数和最小公倍数
int temp = Math.Max(n1, n2);n2 = Math.Min(n1, n2);\/\/n2中存放两个数中最小的 n1 = temp;\/\/n1中存放两个数中最大的 while(n2!=0){ n1 = n1 > n2 ? n1 : n2;\/\/使n1中的数大于n2中的数 int m=n1 % n2;n1 = n2;n2 = m;} System.out.println(n1);\/\/最大公约数 ...

求两个正整数m和n的最大公约数
include <stdio.h> int main(){ int m,n,big,small,i;printf("请输入m,n:\\n");scanf("%d,%d",&m,&n);if(m>n){ big=m;small=n;} else { big=n;small=m;} i=small;while(i>0){ if(big%i==0&&small%i==0){ printf("最大公约数是:%d\\n",i);break;\/\/跳出 } else...