首页 新闻 搜索 专区 学院

求助各位大神,明明是一样的意思,为什么一个错了而另一个却正确了呢,求最大公约数

0
[已解决问题] 解决于 2020-04-14 12:00

include <stdio.h>

int gcd( int x, int y );//求最大公约数

int main()
{
int x, y;

scanf("%d %d", &x, &y);
printf("%d\n", gcd(x, y));

return 0;

}
int gcd( int x, int y )
{
int i;
int n = x;
if(n>y) n = y;
for(int i = n;i >=1;i--)
if(x%i == 0&&y%i == 0)
return i;

}
int gcd( int x, int y )
{
int i;
int n = x;
if(n>y) n = y;
for(int i = n;i >=1;i--)
if(x%i == 0&&y%i == 0)
break;
return i;

}

FutureWorld的主页 FutureWorld | 初学一级 | 园豆:99
提问于:2020-04-12 11:21
< >
分享
最佳答案
1

在C语言中,for的标准形式是不能在for里进行定义i的
C++才能
应该是这样的,所以,你这样做就会出现一些问题,待会我给你写写我的想法

奖励园豆:5
Conan-jine | 小虾三级 |园豆:727 | 2020-04-13 10:48

include <stdio.h>

int gcd( int x, int y );//求最大公约数

int main()
{
int x, y;
scanf("%d %d", &x, &y);
printf("%d\n", gcd(x, y));
return 0;
}
/* 这是正确的 */
//int gcd( int x, int y )
//{
//int i;
//int n = x;
//if(n>y) n = y;
//for(int i = n;i >=1;i--)
//if(x%i == 0&&y%i == 0)
//return i;
//
//}

/* 我给你修改一下格式,看的更明白 */

int gcd( int x, int y )
{
int i=1; //我这里先给你定义一个数字
int n = x;
if(n>y) n = y;
//
for(int i = n;i >=1;i--) //int i=n;对i进行了定义,导致了这里的i和for外面的i是不一样的
{
if(x%i == 0&&y%i == 0)
{
break;
}
}
//注意花括号{}
//for里面的 i 不会影响函数里的i,相当于函数与主函数main的同名定义会有优先级
return i; //而这里会输出定义的数字 1
//
//改成以下是没有问题的
// for(i = n;i >=1;i--)
// {
// if(x%i == 0&&y%i == 0)
// {
// break;
// }
// }
}

Conan-jine | 园豆:727 (小虾三级) | 2020-04-13 10:57

Conan-jine | 园豆:727 (小虾三级) | 2020-04-13 11:02

普及一下知识
C语言中for循环这样定义:
int i;
for(i=0;i<5;i++)

C++中for循环可以这样定义:
for(int i=0;i<5;i++)

注意,两种定义里边,i不要在本函数的其他的地方(比如本函数是main)再定义,否则会出现"优先级,作用域的问题"

Conan-jine | 园豆:727 (小虾三级) | 2020-04-13 11:06

感谢解😂

FutureWorld | 园豆:99 (初学一级) | 2020-04-14 11:24

@FutureWorld: 求结贴最佳

Conan-jine | 园豆:727 (小虾三级) | 2020-04-14 11:27
其他回答(3)
0

x=0不就错了,还有没有返回值的路径

jakio6 | 园豆:1072 (小虾三级) | 2020-04-12 12:58

你好,什么是返回值路径啊😱

支持(0) 反对(0) FutureWorld | 园豆:99 (初学一级) | 2020-04-12 13:01

@FutureWorld: 从a点开始执行,能执行到b点,就有路径,不知道有没有这样的说法

支持(0) 反对(0) jakio6 | 园豆:1072 (小虾三级) | 2020-04-12 13:11
0

看上去确实是一样的,建议设断点调试一下。另外建议for和if就算只有一条语句也加大括号,最后建议格式话一下代码

codes
会长 | 园豆:8183 (大侠五级) | 2020-04-12 16:40

嗯嗯,谢谢了各位。
真TM奇怪😂

支持(0) 反对(0) FutureWorld | 园豆:99 (初学一级) | 2020-04-12 16:53

@FutureWorld: 设断点跟一下就真相大白了也许

支持(0) 反对(0) 会长 | 园豆:8183 (大侠五级) | 2020-04-12 18:44
0
int gcd( int x, int y )
{
int i;
int n = x;
if(n>y) n = y;
for(int i = n;i >=1;i--)
if(x%i == 0&&y%i == 0)
break;
return i;

}

你这样写是有问题的,一开始写了int i,在for循环里又int i。break跳出来的返回的你之前定义的i,默认值是0.
第一个没错是因为你在for循环里返回了i,

Shendu.CC | 园豆:1914 (小虾三级) | 2020-04-12 23:26

😢😢,哦,好像是啊,好蠢啊,哎,谢谢,非常感谢

支持(0) 反对(0) FutureWorld | 园豆:99 (初学一级) | 2020-04-13 00:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册