算法设计:
方法一:第一种思路是枚举(穷举法、列举法),但是枚举又可以分为两种方法。第一种,采用穷举法按从小到大(初值为1,最大值为两个整数当中较小的数)的顺序将所有满足条件的公约数列出,输出其中最大的一个;第二种,按照从大(两个整数中较小的数)到小(到最小的整数1)的顺序求出第一个能同时整除两个整数的自然数,即为所求。
代码示例如下:
#includeint main() { int a, b; scanf("%d %d", &a, &b);//低版本编译器使用scanf 高版本编译器使用scanf_s int i; int gcd; gcd = 1; for(i = (a 0; i--) { if(a % i == 0 && b % i == 0) { gcd = i; break; } } printf("gcd = %dn", gcd); return 0; }
#includeint Get_Max_Comm_Divisor(int num1, int num2) { int i = 0; //获取两个整数的最小值 int min = num1 < num2 ? num1 : num2; //从两个数的最小值开始递减遍历 for (i = min; i > 0; i--) { //i为num1和num2的公倍数 if (num1 % i == 0 && num2 % i == 0) break; } return i; } int main() { int num1 = 0, num2 = 0; puts("请输入两个正整数."); scanf_s("%d%d", &num1, &num2); printf("最大公约数为%d.n", Get_Max_Comm_Divisor(num1, num2)); return 0; }
运行结果如下:
方法二: 辗转相除法 1.如果b == 0,计算结束,a为最大公约数; 2.否则,计算a除以b的余数,让a等于b,而b等于那个余数; 3.返回第1步代码示例如下:
#includeint main(int argc, const char* argv[]) { int a; int b; int temp; scanf_s("%d %d", &a, &b);//低版本编译器使用scanf 高版本编译器使用scanf_s while (b != 0) { temp = a % b; a = b; b = temp; } printf("gcd = %dn", a); return 0; }
代码运行结果如下:
方法三: 更相减损法1.求出两个正整数num1和num2的差值diff;
2.将num2赋值给num1,让上次相减时的减数num2作为下次相减时的被减数。
同时将当前的差值diff作为下次相减的减数。
这样一直地辗转相减,直到差值为0,这时的除数num2就是我们要求的最大公因数
代码示例如下:
#includeint Get_Max_Comm_Divisor(int num1, int num2) { //两数相减的结果(取正值) int diff = num1 > num2 ? num1 - num2 : num2 - num1; while (diff != 0) { num1 = num2; //更新被减数 num2 = diff; //更新减数 diff = num1 > num2 ? num1 - num2 : num2 - num1; //更新两数相减的结果(取正值) } return num2; //最后的减数即为最大公因数 } int main() { int num1 = 0, num2 = 0; puts("请输入两个正整数."); scanf_s("%d%d", &num1, &num2);//低版本编译器用scanf 高版本编译器用scanf_s printf("最大公约数为%d.n", Get_Max_Comm_Divisor(num1, num2)); return 0; }
代码运行结果如下:
方法四:Stein算法函数递归调用
#include "stdio.h" #includeint gcd(int u, int v) { if (u == 0) return v; if (v == 0) return u; if (~u & 1) { if (v & 1) return gcd(u >> 1, v); else return gcd(u >> 1, v >> 1) << 1; } if (~v & 1) return gcd(u, v >> 1); if (u > v) return gcd((u - v) >> 1, v); return gcd((v - u) >> 1, u); } int main() { int z[2][20] = { {1,1},{31,43,46,65,43,58,55,54,55,56,98,78,96,54,78,85,57,12,36,15} }; int i = 0; double run_time; LARGE_INTEGER time_start; //开始时间 LARGE_INTEGER time_over; //结束时间 double dqFreq; //计时器频率 LARGE_INTEGER f; //计时器频率 int m, n, t2; getch(); QueryPerformanceFrequency(&f); dqFreq = (double)f.QuadPart; QueryPerformanceCounter(&time_start); //计时开始 for (i = 0; i < 20; i++) { t2 = gcd(z[0][i], z[1][i]); printf("The higest common divisor is %dn", t2); } QueryPerformanceCounter(&time_over); //计时结束 run_time = 1000000 * (time_over.QuadPart - time_start.QuadPart) / dqFreq; //乘以1000000把单位由秒化为微秒,精度为1000 000/(cpu主频)微秒 printf("nrun_time:%fusn", run_time); return 0; }
Stein算法非函数递归调用
#include "stdio.h" #includeint Stein(int x,int y) { int factor=0; int temp; if(x >1; x-=y; } else { y>>=1; } } else { if(y&0x1) { x>>=1; if(x >=1; y>>=1; ++factor; } } } return (x< {1,1},{31,43,46,65,43,58,55,54,55,56,98,78,96,54,78,85,57,12,36,15}}; int i = 0; double run_time; LARGE_INTEGER time_start; LARGE_INTEGER time_over; double dqFreq; LARGE_INTEGER f; int m,n,t2; getch(); QueryPerformanceFrequency(&f); dqFreq=(double)f.QuadPart; QueryPerformanceCounter(&time_start); for( i = 0; i < 20; i++){ t2 = Stein(z[0][i],z[1][i]); printf("The higest common divisor is %dn",t2); } QueryPerformanceCounter(&time_over); run_time=1000000*(time_over.QuadPart-time_start.QuadPart)/dqFreq; printf("nrun_time:%fusn",run_time); return 0; }
代码运行效果如下:
编者注:以上对本小题的代码编写的多种方法,欢迎大家收藏借鉴并转发;
以上代码仅供参考,如有问题欢迎大家在留言区批评指正;
版权所有,翻印必究,如有雷同纯属巧合,转载请注明出处。
By CRH380AJ2808 2022.04.23
————————————————
版权声明:本文为CSDN博主「CRH380AJ2808」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/JH13thpig/article/details/124361837



