正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
数据范围:
//遍历法求最小公倍数 #include "stdio.h" int main() { int a ,b ,i,c; scanf("%d %d", &a, &b); for(i = 1; i <= a; i++) { if(a % i ==0 && b % i == 0)//此时i为最大公约数 { c = i; } } printf("%d", (a * b) / c); //注意输出最小公倍数不能放在for里面,否则(如果需要多次循环)会多次输出。外面也不能直接用i进行计算(因为会继续运算加上去,直到不满足i<=a的条件),需要用一个额外的变量在if里来暂存i。 //公约数显然是能让两个数都对其取余的结果==0;经过i一直往上加,并将最符合要求的放入c可得到最大公约数。i必须从1开始遍历,理由是互质数的最大公约数就是1;两数中较大的一方为最小公倍数时,使用此法仍可以正确地得到最大公因数和最小公倍数。 return 0; }
#include<stdio.h> int main() { int A = 0; int B = 0; scanf("%d %d", &A, &B); int m = (A > B ? A : B); while (m % A != 0 || m % B != 0) { m++; } printf("%d", m); return 0; }
我这个思路是将其中大的数作为标准,进行加一,直到能同时除以A,B时,不进行加一。
#include<stdio.h> int main() { int A = 0; int B = 0; scanf("%d %d", &A, &B); int i = 1; while (A * i % B != 0) { i++; } printf("%d", A * i); return 0; }
这个代码是简化版,因为上一个是加一太慢了,我们采用一种倍数的关系来解决。首先m / a = i; a * i % b == 0. 所以a * i % b == 0时就代表是公倍数了。
#include<stdio.h> int main() { int a,b,out=1; int j=0; scanf("%d",&a); scanf("%d",&b); int a1,b1; a1=a; b1=b; if(a>b) { if(a%b==0) out=a; else if(a%b) { for(int i=2;i<b;i++) { while(a%i==0&&b%i==0) { a=a/i; b=b/i; i=2; } } out=a*b1; } } else if(a<b) { if(b%a==0) out=b; else if(b%a) { for(int i=2;i<a;i++) { while(a%i==0&&b%i==0) { a=a/i; b=b/i; i=2; } } out=a*b1; } } else out=a; printf("%d",out); return 0; }
//goto 语句用于判断最小公倍数是否能被整除多次,暂时没想到好的算法了。。 #include<stdio.h> int main() { int a,b,max; int sum=1; scanf("%d %d",&a,&b); int i; if(a>b) max=a; else max=b; out: for(i=2;i<=max;i++) { if((a%i==0)&&(b%i==0)) { a/=i; b/=i; sum*=i; goto out; } } sum=sum*a*b; printf("%d",sum); }
#include<stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); for(int i=a;i<=a*b;i++) { if(i%a==0 && i%b ==0) { printf("%d",i); break; } } return 0; }