求最大公约数
#include<stdio.h>main()
{
int a,b,temp;
void max(int a,int b);
printf("请输入两个正整数:\n");
scanf("%d,%d",&a,&b);
if (a==b)
printf("最大公约数为%d",a);
else if (a<b)
{temp=a;a=b;b=temp;
max(a,b);}
}
void max(int a,int b)
{
int i;
int x,y;
for (i=b;i>0;i--)
{
x=a%i;
y=b%i;
if (x==0||y==0)
{printf("%d",i);
break;}
}
}
代码如上,请问哪里有问题?编译正常,但结果不对 不知道楼主用的是什么算法,给楼主一个标准的欧几里德(辗转相除)算法
#include <stdio.h>
int max(int a , int b)
{
int i ;
while(b) {
i = a % b ;
a = b ;
b = i ;
}
returna ;
}
int main(void)
{
int a , b ;
printf("请输入两个正整数:") ;
scanf("%d%d" , & a , & b) ;
printf("最大公约数为 : %d\n" , max(a , b)) ;
}
编译、运行实况:
D:\00.Excise\C>g++ -o x x.c
D:\00.Excise\C>x
请输入两个正整数:36 48
最大公约数为 : 12
D:\00.Excise\C> 本帖最后由 风过无痕1989 于 2020-12-27 00:55 编辑
// 求最大公约数 greatest common divisor
#include<stdio.h>
main()
{
int gcd(int *a, int *b); // 函数名就取三个英文单词的第一个字母好了(当然可以用其他的函数名)
int a, b, temp; // 声明函数放前面,此条语句移下来(不是因为其他,只是习惯上这么做)
printf("请输入两个正整数:\n");
scanf("%d%d", &a, &b); // 除控制符外,不要添加其他的符号
if (a == b)
printf("最大公约数为%d", a);
else if (a < b) // 此处已经是交换了,最大值就是 a
{
temp = a;
a = b;
b = temp;
temp = gcd(&a, &b); // 使用函数要传地址,否则函数使用完了,数据也就自动消失了
printf("greatest common divisor is %d\n", temp);
}
}
int gcd(int *a, int *b) // 碾转相除法
{
int x = 1; // x 不等于0就行,确保循环能进行即可
while (x != 0)
{
x = *a % *b; // 相数相除,取余数
*a = *b; // 除数作被除数
*b = x; // 余数作除数,循环,直到 x = 0
}
return *a;
} 你这个最下面弄错了把,应该是if(x==0&&y==0),你去看看||和&&的差别就知道了。 还有哪个a和b的顺序别输入错了
风过无痕1989 发表于 2020-12-26 01:53
就是形式参数是指针形式? 严凯 发表于 2020-12-26 14:59
你这个最下面弄错了把,应该是if(x==0&&y==0),你去看看||和&&的差别就知道了。
我改了,也不行 905853663 发表于 2020-12-27 00:11
就是形式参数是指针形式?
运行时也是指针形式呀,你稍等,我试试看,不用指针行不行,反正交换两个数值,不用指针是交换不了的 本帖最后由 风过无痕1989 于 2020-12-27 00:58 编辑
905853663 发表于 2020-12-27 00:11
就是形式参数是指针形式?
刚才试错了,不用指针也是可以的。不过通过了函数这个东西,我还是习惯于用指针,用指针保险
// 求最大公约数 greatest common divisor
#include<stdio.h>
main()
{
int gcd(int *a, int *b); // 函数名就取三个英文单词的第一个字母好了(当然可以用其他的函数名)
int a, b, temp; // 声明函数放前面,此条语句移下来(不是因为其他,只是习惯上这么做)
printf("请输入两个正整数:\n");
scanf("%d%d", &a, &b); // 除控制符外,不要添加其他的符号
if (a == b)
printf("最大公约数为%d", a);
else if (a < b) // 此处已经是交换了,最大值就是 a
{
temp = a;
a = b;
b = temp;
temp = gcd(a, b); // 使用函数要传地址,否则函数使用完了,数据也就自动消失了
printf("greatest common divisor is %d\n", temp);
}
}
int gcd(int a, int b) // 碾转相除法
{
int x = 1; // x 不等于0就行,确保循环能进行即可
while (x != 0)
{
x = a % b; // 相数相除,取余数
a = b; // 除数作被除数
b = x; // 余数作除数,循环,直到 x = 0
}
return a;
} 风过无痕1989 发表于 2020-12-27 00:26
刚才试错了,不用指针也是可以的。不过通过了函数这个东西,我还是习惯于用指针,用指针保险
噢噢好的 风过无痕1989 发表于 2020-12-27 00:26
刚才试错了,不用指针也是可以的。不过通过了函数这个东西,我还是习惯于用指针,用指针保险
我还是想知道我那个代码是哪里错了,我一直分析都感觉没错误,但是我输入两个连续的数比如34和35,它就能显示结果1,但是其他数据输出的东西是空白,我又改了一下
#include<stdio.h>
main()
{
int a,b,temp;
void max(int a,int b);
printf("请输入两个正整数:\n");
scanf("%d%d",&a,&b);
if (a==b)
printf("最大公约数为%d",a);
else if (a<b)
{temp=a;a=b;b=temp;
max(a,b);}
}
void max(int a,int b)
{
int i;
int x,y;
for (i=b;i>0;i--)
{
x=a%i;
y=b%i;
if (x==0&&y==0)
{printf("%d",i);
break;}
}
}
风过无痕1989 发表于 2020-12-27 00:26
刚才试错了,不用指针也是可以的。不过通过了函数这个东西,我还是习惯于用指针,用指针保险
已经知道了,是一个花括号搞错了{:10_266:}
页:
[1]