C语言代码改错(A C)

A比大小


#include <stdio.h>
#include <stdlib.h>
int main()
{
    long long a, b, n, i;
    scanf("%lld",&n);
    for(i = 0;i < n;i ++){ 
        while (scanf("%lld%lld", &a, &b) == 2) {
            if(n==100)
            break;
            else
            if (abs(a) >= abs(b)) {
                printf("Yes\n");
            } 
            else {
                printf("No\n");
            }
        } 
    }
    return 0;
}

img

C数字序列


#include <stdio.h>
int main() {
    int f(int n),n,count=0;
    scanf("%d", &n);
    while(n>1){
        if (n % 2 == 1) {
        return f(3 * n + 1) + 1;
        }
        else {
        return f(n / 2) + 1;
        }
        count++;
    }
    printf("%d\n",count);
    return 0;
}

img

求符合要求的正确代码以及正确运行出题目里输入输出例子的截图

以下是修改后的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long long a, b, n, i;
    scanf("%lld", &n);
    for (i = 0; i < n; i++) {
        scanf("%lld%lld", &a, &b); // 放到for循环内部,每次读入一组数据
        if (llabs(a) >= llabs(b)) { // 使用llabs计算绝对值
            printf("Yes\n");
        }
        else {
            printf("No\n");
        }
    }
    return 0;
}

修正了以下问题:

  1. 调用scanf函数时没有检查返回值,可能导致输入错误;
  2. 循环内包含一个while循环,会无限等待输入,应该只使用一个scanf读取一组a和b的值;
  3. 比较绝对值时建议使用llabs函数而不是abs函数,避免在类型转换时出错。

A比大小 第一个数输入多余吧?把第7行scanf("%lld",&n);注释掉就行:
-123
123
Yes
-123
234
No


C数字序列,应该是f(3)=7

int f(int n) {
    int count = 0;
    // 如果n为奇数,则n变为3n+1,否则变为n/2,直到n变为1
    while (n > 1) {
        if (n % 2 == 1) {
            n = 3 * n + 1;
        }
        else {
            n /= 2;
        }
        count++;
    }
    return count;
}

输入3,循环如下:
1: 3n+1=10
2: n/2=5
3: 3n+1=16
4: n/2=8
5: n/2=4
6: n/2=2
7: n/2=1
但是这个题的输入输出没对上,不知是什么逻辑


#include <stdio.h>
#include <math.h>
int main()
{
    int sz[200];
    int i = 0;
    do {
        scanf_s("%d",&sz[i]);
        i++;
        scanf_s("%d", &sz[i]);
        i++;
    } while (getchar()=='\n'&&getchar()!='\n');
    for (int a = 0; a <i; a=a+2)
    {
        if (abs(sz[a]) >= abs(sz[a + 1]))
        {
            printf("Yes\n");
        }
        else
        {
            printf("No\n");
        }
    }
}

1.
根据题目要求,我们需要在 C 语言中实现比大小,且不能使用高精度类。以下是修改后的程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(char *a, char *b) {
    int lena = strlen(a), lenb = strlen(b);
    if (lena != lenb) {
        return lena > lenb ? 1 : -1;
    }
    for (int i = 0; i < lena; i++) {
        if (a[i] != b[i]) {
            return a[i] > b[i] ? 1 : -1;
        }
    }
    return 0;
}

int main() {
    int n;
    char a[1005], b[1005];
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%s%s", a, b);
        int cmp = compare(a, b);
        if (cmp >= 0) {
            printf("Yes\n");
        } else {
            printf("No\n");
        }
    }
    return 0;
}

以上程序中,我们通过自己实现一个比较函数 compare 来比较两个数的大小,避免使用高精度类。需要注意的是,由于题目中输入的数可能为负数,因此在比较两个数大小时需要先判断它们的符号,然后再比较它们的绝对值大小。具体来说,我们可以先比较两个数的位数,如果位数不同,则位数多的数更大;如果位数相同,则从高位到低位逐位比较,直到找到不同的位为止。如果找到了不同的位,则比较它们的大小,如果两个数相等,则继续比较下一位,直到比较完所有位。最后,根据比较结果输出 Yes 或 No。

2.
以下是修改后的程序,主要是修复了递归调用时没有将结果返回的问题,并且在最后输出 count 的位置做了调整:



#include <stdio.h>

int f(int n) {
    if (n == 1) {
        return 1;
    }
    if (n % 2 == 1) {
        return f(3 * n + 1) + 1;
    } else {
        return f(n / 2) + 1;
    }
}

int main() {
    int a, b, i, max_len = 0;
    while (scanf("%d%d", &a, &b) != EOF) {
        if (a > b) {
            // 交换 a 和 b
            int temp = a;
            a = b;
            b = temp;
        }
        max_len = 0;
        for (i = a; i <= b; i++) {
            int len = f(i);
            if (len > max_len) {
                max_len = len;
            }
        }
        printf("%d\n", max_len);
    }
    return 0;
}

修改后的程序正常运行时,可以按以下方式输入和输出数据:

输入:
101 110
1 10
输出:
119
20

int f(int n) {
    int count = 0;
    // 如果n为奇数,则n变为3n+1,否则变为n/2,直到n变为1
    while (n > 1) {
        if (n % 2 == 1) {
            n = 3 * n + 1;
        }
        else {
            n /= 2;
        }
        count++;
    }
    return count;
}

```c


```

解答参考

#include <stdio.h>
#include <stdlib.h>
int main()
{
    long long a[100], b[100], n=0, i=0,flag=0;
    printf("please  enter n ");
    //scanf("%lld",&n);
    do
    {
        flag=scanf("%lld%lld", &a[n], &b[n]);
        printf("the flag =%d\n", flag);
        if(flag==2)
        {
            n++;
            if(n==100)
            {
                flag=0;
            }
        }
    } while (flag!=0);
    
    for(i = 0;i < n;i ++)
    { 
        
        
        if (abs(a[i]) >= abs(b[i])) 
        {
            printf("Yes\n");
        } 
        else 
        {
            printf("No\n");
        }
        
    }
    return 0;
}

第二题

#include <stdio.h>
 
int fun(int n);
int count=0;
int main() 
{
    int a,b;
    int a1,b1;
    scanf("%d%d", &a,&b);
    count=0;
    fun(a);
    a1=count;
    count=0;
    fun(b);
    b1=count;
    if(a1>b1)
        printf("%d\n",a1);
    else
        printf("%d\n",b1);
    return 0;
}
 
int fun(int n)
{
    if(n==1)
    {
        count+=1;
        return 1;
        
    }
    else
    {
        if(n%2 == 1)
        {
            count+=1;
            return fun(3*n+1);
        }
        else
        {
            count+=1;
            return fun(n / 2);
        }
    }
 
}
 

两个题目的程序如下所示,第二个题目的10,1的结果应该是有问题的。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    long long a[100], b[100], n=0, i=0,flag=0;
    printf("please  enter n ");
    //scanf("%lld",&n);
    do
    {
        flag=scanf("%lld%lld", &a[n], &b[n]);
        printf("the flag =%d\n", flag);
        if(flag==2)
        {
            n++;
            if(n==100)
            {
                flag=0;
            }
        }
    } while (flag!=0);
    
    for(i = 0;i < n;i ++)
    { 
        
        
        if (abs(a[i]) >= abs(b[i])) 
        {
            printf("Yes\n");
        } 
        else 
        {
            printf("No\n");
        }
        
    }
    return 0;
}
```c
第二题

```c
#include <stdio.h>

int fun(int n);
int count=0;
int main() 
{
    int a,b;
    int a1,b1;
    scanf("%d%d", &a,&b);
    count=0;
    fun(a);
    a1=count;
    count=0;
    fun(b);
    b1=count;
    if(a1>b1)
        printf("%d\n",a1);
    else
        printf("%d\n",b1);
    return 0;
}

int fun(int n)
{
    if(n==1)
    {
        count+=1;
        return 1;
        
    }
    else
    {
        if(n%2 == 1)
        {
            count+=1;
            return fun(3*n+1);
        }
        else
        {
            count+=1;
            return fun(n / 2);
        }
    }

}