输出两个数求最大公倍数,所得值错误,请问是什么原因?程序和运行皆如下所示
由于for循环结尾多了分号,导致循环空转,最终i=24停止
然后if判断不满足,所以gcd是一个随机值
for语句后面的分号删掉
for循环那里的问题,修改如下,望采纳!!
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num1,num2,i,gcd;
scanf("%d %d",&num1,&num2);
for(i=1;i<=num1&&i<=num2;++i){
if(num1 % i ==0 && num2 % i==0){
gcd = i;
}
}
printf("最大公约数为%d",gcd);
return 0;
}
运行结果:
分析:一组数的最大公倍数肯定小于这组数的最小数,然后从这个最小数开始穷举,每次判断这组数是否可以全部整除这个数,若可以,则该数为这组数的最大公约数;否则,继续穷举;知道找到为止。
代码实现:
#include<stdio.h>
#include<stdbool.h>
#include<math.h>
#define max 4
void set_array();//初始化数组
void print_array();//输出数组
int Min_Num(int *p);//返回数组中的最小数
bool Determine_divisible(int *p, int n);//判断n是否可以整除*p中所有数
int main()
{
int a[max] = { 0 };
set_array(a);
print_array(a);
int min = Min_Num(a);
for (int i = min; i > 0; i--)
{
if (Determine_divisible(a, i))
{
printf("\n这几个数的最小公约数:%d\n", i);
break;
}
}
for (int i = a[0]; i > 0; i--)
//此处i的初始值不同,相比与上一个循环可以不用Min_Num()函数的辅助,省去求最小值的时间。
/*给i赋这组数中任意值,若改值可以被其他数整除,故该数为最大公倍数(这种情况只存在于所给数恰好为最小数,且该数可以整除其余数)
否则递减,直到满足所有数都可被i整除 */
{
if (Determine_divisible(a, i))
{
printf("这几个数的最小公约数:%d\n", i);
break;
}
}
return 0;
}
void set_array(int p[])
{
for (int i = 0; i < max; i++)
{
scanf("%d", &p[i]);
}
}
void print_array(int *p)
{
for (int i = 0; i < max; i++)
{
printf("%d\t", p[i]);
}
}
int Min_Num(int *p)
{
int t = p[0];
for (int i = 1; i < max; i++)
{
t = p[i]>t ? t : p[i];
}
return t;
}
bool Determine_divisible(int *p, int n)
{
for (int i = 0; i < max; i++)
{
if (p[i] % n != 0)
{
return false;
}
}
return true;
}