#include<stdio.h> int fun(int a,int b) {int t,j,k,i,s[a+b]; for(i=0;i<a&&i<b;i++) {for(j=0;j<a+b;j++) {if(a%i==0&&b%i==0) s[j]=i; } } for(j=0;j<a+b;j++) {for(k=0;k<a+b-j;k++) {if(s[j]>s[j+1]) {t=s[j]; s[j]=s[j+1]; s[j+1]=t; } } } return s[a+b-i]; } int main(){ int a,b,i,s[a+b-i]; scanf("%d,%d",&a,&b); fun(a,b); printf("%d",s[a+b-i]); return 0; }
时间: 2024-01-10 09:03:34 浏览: 25
这段代码的功能是求两个整数的最大公约数,但是有几个问题:
1. 函数内部定义的数组 `s[a+b]` 的大小并不确定,应该将其定义为一个足够大的常量或通过动态内存分配来解决。
2. 在第一个循环中,条件应该是 `i<=a&&i<=b` 而不是 `i<a&&i<b`,因为最大公约数不可能大于两个数中的最小值。
3. 在第一个循环中,判断条件应该是 `if(a%i==0&&b%i==0)` 而不是 `if(a%i==0||b%i==0)`,因为最大公约数必须同时是两个数的约数。
4. 在排序循环中,内层循环的条件应该是 `k<j` 而不是 `k<a+b-j`,因为已经排好序的元素不需要再次比较。
5. 函数返回值应该是最大公约数,而不是数组中第 `a+b-i` 个元素的值。
修改后的代码如下:
```
#include <stdio.h>
#define MAX_SIZE 100000
int fun(int a, int b) {
int i, j, k, t, s[MAX_SIZE];
for (i = 1; i <= a && i <= b; i++) {
if (a % i == 0 && b % i == 0) {
s[j++] = i;
}
}
for (j = 0; j < i; j++) {
for (k = 0; k < i - j - 1; k++) {
if (s[k] > s[k + 1]) {
t = s[k];
s[k] = s[k + 1];
s[k + 1] = t;
}
}
}
return s[j - 1];
}
int main() {
int a, b;
scanf("%d,%d", &a, &b);
printf("%d", fun(a, b));
return 0;
}
```