c语言学习之 辗转相除法求最大公约数

1. 如果b等于0,则计算结束,最大公约数是a,

2. 否则,计算a除以b的余数,让a等于b,让b等于那个余数,

3.回到第一步。

代码实现:

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5     int a, b;
 6     scanf("%d %d", &a, &b);
 7     int t;
 8
 9     while ( b != 0){
10         t = a % b;
11         a = b;
12         b = t;
13         printf("a=%d, b=%d, c=%d", a, b, t);
14     }
15     printf("\ngcd=%d", a);
16
17     return 0;
18  } 
时间: 2024-07-28 17:11:58

c语言学习之 辗转相除法求最大公约数的相关文章

辗转相除法求最大公约数

辗转相除法求最大公约数 设两数为a.b(b<a),求它们最大公约数(a,b)的步骤如下:用b除a,得a=bq......r1(0≤r).若r1=0,则(a,b)=b:若r1≠0,则再用r1除b,得b=r1q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止.其最后一个非零余数即为(a,b). 从某处找的证明: 原理及其详细证明 在介绍这个方法之前,先说明整除性的一些特点(下文的所有数都是正整数,不再重覆),我们可以这样给出

鸡兔同笼问题、百鸡问题、辗转相除法求最大公约数

一.鸡兔同笼 鸡和兔子35只,腿一共有94条,求出鸡和兔子的数量各是多少?(鸡的数目是23,兔子的数目是12) $n = 0; for($ i=1;$i<35;$i++){ $n ++; //n=34; $ j=35-i; if(i*2+j*4==94){ printf("鸡的数目是%d只, 兔子的数目是%d只",$i,$j); } } 此时,循环进行了34次.但是,有些循环是无意义的,因为得到了结果,循环还在继续往下执行.我们知道:两个未知数,两个方程,其方程组的解唯一!那么我

辗转相除法求最大公约数,非goto

1 #include<iostream> 2 using namespace std; 3 //不推荐用goto,当然用它更快 4 //辗转相除法求两数的最大公约数 5 int gcd(long int a,long int b){ 6 int x=a<b?a:b; 7 //获得较小者,用来做循环的约束值 8 9 for(int i=0;i<x;x++){ 10 //循环 11 if(a>b){ 12 int r=a%b;//取余数 13 if(r==0){//能否整除判断

辗转相除法求最大公约数------一行代码

今天学到一行代码,感觉好牛逼--------当然是老师上课讲的. 辗转相除法是求最大公约数最好的方式了吧! 辗转相除法原理我也不想多说,百度一下就可以了(基本就是用大数与小数取余,再用比余数大一点的数与余数取余, 反复直到出现余数为0,那个比0大一点的数就是最大公约数) 好了,废话不多说了------上代码 int gcd(int m, int n){ return n % m == 0 ? m : gcd(n%m, m); } 详细讲解一下: 优势是使用了递归,一直让大数与小数取余,直到出现0

辗转相除法求最大公约数和最小公倍数分析

求最大公约数和最小公倍数 程序分析: (1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数: (2)求最大公约数用辗转相除法(又名欧几里德算法) 辗转相除法: #include<stdio.h> int main() { int a,b,c; int raw_a,raw_b; scanf("%d %d",&a,&b); raw_a=a;raw_b=b; c=a%b; while (c!=0) { a=b;b=c; c=a%b; } p

C辗转相除法求最大公约数的实现

int gcd(int a, int b)//求最大公约数,a为分子,b为分母 { if(b == 0) return a; return gcd(b,a%b); }

c语言:辗转相除法求最大公约数、最小公倍数

辗转相除法,又称欧几里得算法.两个正整数a和b(a>b),它们的最大公约数等于余数c和较小的数b之间的最大公约数.最小公倍数=两数之积/最大公约数 #include <stdio.h>int get1(int a, int b){ if (a < b) { int c = a; a = b; b = c; } while (a%b != 0) { b = a%b; a = b; } return b;}int get2(int a,int b){ return a*b / get1

nyoj 189 兔子的烦恼(一)(辗转相除法求最大公约数)

题目189 题目信息 运行结果 本题排行 讨论区 兔子的烦恼(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 在一座山上有n个山洞(每个洞从0~n-1分别编号),这山上有一只兔子躲在山洞里,有一只狼,从编号为0的山洞开始入洞,每隔m-1个洞,再次入洞抓兔子,现在问,兔子能否避免这场灾难? 例如:m=2 and n=6, 狼将要进入的山洞号为:0,2,4,0; 输入 有多组测试数据,不超过1000组; 每组有两个整数m,n(0<m,n<=1000); 注意:程

辗转相除法求最大公约数和最小公倍数

要求最小公倍数可先求出最大公约数 设要求两个数a,b的最大公约数 伪代码: int yushu,a,b: while(b不等于0) { yushu=a对b求余 b的值赋给a yushu的值赋给b } 代码: int gongyue() { int yushu,a,b; while(b) { yushu=a%b; a=b; b=yushu; } return b; } 此子函数可以求出两个数的最大公约数n    最小公倍数为a*b/n: