标签:code ges 小数 约数 个数 clu 内容 http color
求两数最大公约数的方法有很多,这里重点介绍这两种算法:
辗转相除法 和 更相减损法。
1、辗转相除法。
在两个数中,找出大数,用大数除以小数,得到整数商和余数,然后再不断地用除数(原来的小数)除以余数,直到没有余数为止。
那么除数即为最大公约数。
所以我们可以用一个循环来进行被除数、除数和余数之间的位置互换。
也可以用goto语句来进行循环操作。
要注意的是,goto语句在一个程序当中最好不要多次出现,否则程序很有可能混乱。
这里给出一个利用goto语句完成的程序代码:
#include<stdio.h> int main() { int a = 6, b = 16,t; if (a < b) { t = a; a = b; b = t; } flag: if (a%b == 0) { printf("%d\n", b); } else { t = a; a = b; b = t%b; goto flag; } system("pause"); return 0; }
PS:如果用循环来做的时候,我们需要将flag~goto语句中间的部分作为循环体。
2、更相减损法。
这个算法原出自于《九章算术》中,将算法内容用现代汉语翻译后为:
#include<stdio.h> #include<math.h> int main() { int i = 0, t, x, a = 6, b = 16, result; while ((a % 2 == 0) && (b % 2 == 0)) { a /= 2; b /= 2; i += 1; } if (a < b) { t = a; a = b; b = t; } do { x = a - b; if (b == x) break; a = (b > x) ? b : x; b = (b < x) ? b : x; } while (x); if (i == 0) { result = b; printf("%d\n", result); } else { result = (int)pow(2, i)*b; printf("%d\n", result); } system("pause"); return 0; }
两种方法相比,辗转相除法的代码效率更高,所以更推荐使用辗转相除法。
最后附上程序运行的结果:
标签:code ges 小数 约数 个数 clu 内容 http color
原文地址:http://www.cnblogs.com/xiefei777/p/7624333.html