鱼C论坛

 找回密码
 立即注册
查看: 1917|回复: 4

[已解决]请问大佬这题怎么写?

[复制链接]
发表于 2023-3-27 20:23:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
https://www.dotcpp.com/oj/problem1009.html
大佬你好,请问为什么我这个程序会答案错误?
请问如何修改?
你觉得这道题目怎么写,才能更加优化?
#include<stdio.h>
int main()
{
        int num,a,c= 0;
        int i = 1;
        int b[6] ;
        
        scanf("%d",&num);
        a = num;
        
        while(a >= 10)
        {
                a = a / 10;
                i++;
        }

        
        if(i<=5){
        printf("%d\n",i);
        a = num;
        do
        {
                b[c] = a % 10 ;
                a = a / 10;
                c++;
        }while(a >= 10);
        
        b[c] = a;
                
        while(c>=0){
                printf("%d",b[c]);
                printf(" ");
                c--;
        }
        printf("\b\n"); 
        
        c = 0;
        while(c<=i-1){
                printf("%d",b[c]);
                c++;
        }
}
        else{
                ;
        }
        return 0;
}
最佳答案
2023-3-27 20:31:44
本帖最后由 柿子饼同学 于 2023-3-27 20:43 编辑

可以用字符串

你的代码问题在于 依次打印数字时 , 没有考虑到数字是一位数的情况 , 你使用 do-while 语句 , 所以如果是一位数 c 也会自己加一次 , 变成 1
这时 输出的第二行 就会打印两个数字了
改进可以把 do-while 改成 while

用字符串更容易实现翻转 , 长度计算什么的 , 可以用 string.h 的 strlen 函数求字符串长度 , 这里直接把这个数字当作字符串去处理 , 比较方便
#include <stdio.h>
#include <string.h>

char num[8];
int len;

int main(){

    scanf("%s", num);

    len = strlen(num);

    printf("%d\n", len);  // 长度
    
    for(int i = 0; i < len; i++){
        printf("%c ", num[i]);
    }

    printf("\n");

    for(int i = len - 1; i >= 0; i--){  // 这里注意范围
        printf("%c", num[i]);
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-27 20:31:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 柿子饼同学 于 2023-3-27 20:43 编辑

可以用字符串

你的代码问题在于 依次打印数字时 , 没有考虑到数字是一位数的情况 , 你使用 do-while 语句 , 所以如果是一位数 c 也会自己加一次 , 变成 1
这时 输出的第二行 就会打印两个数字了
改进可以把 do-while 改成 while

用字符串更容易实现翻转 , 长度计算什么的 , 可以用 string.h 的 strlen 函数求字符串长度 , 这里直接把这个数字当作字符串去处理 , 比较方便
#include <stdio.h>
#include <string.h>

char num[8];
int len;

int main(){

    scanf("%s", num);

    len = strlen(num);

    printf("%d\n", len);  // 长度
    
    for(int i = 0; i < len; i++){
        printf("%c ", num[i]);
    }

    printf("\n");

    for(int i = len - 1; i >= 0; i--){  // 这里注意范围
        printf("%c", num[i]);
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-27 20:33:40 | 显示全部楼层
1、将b数组大小从6更改为5,因为题目要求的整数最多有5位。
2、修改了计算逆序数字的方法。在原代码中,你使用了do-while循环来计算逆序数字,但是,这样的实现可能会导致错误。在新代码中,我将do-while循环替换为while
#include <stdio.h>

int main()
{
    int num, a, c = 0;
    int i = 1;
    int b[5];

    scanf("%d", &num);
    a = num;

    while (a >= 10)
    {
        a = a / 10;
        i++;
    }

    if (i <= 5)
    {
        printf("%d\n", i);
        a = num;
        while (a > 0)
        {
            b[c] = a % 10;
            a = a / 10;
            c++;
        }

        for (int j = i - 1; j >= 0; j--)
        {
            printf("%d", b[j]);
            if (j != 0)
                printf(" ");
        }
        printf("\n");

        for (int j = 0; j < i; j++)
        {
            printf("%d", b[j]);
        }
        printf("\n");
    }
    else
    {
        ;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-3-27 20:41:00 | 显示全部楼层
您好,这道题目的要求是将一个整数的每一位数倒序输出,您的程序的思路基本正确,但是在输出时有一些小问题。
以下是您的程序的修改建议:
1.在第一个while循环中,应该判断a是否大于0,因为如果a=0,那么i的值应该为1,而不是0。
2.在第一个do-while循环中,当a小于10时,应该将最后一位数加入到数组中。
3.在第一个while循环中,当a小于10时,应该将i的值加1。
4.在第二个while循环中,应该从0开始循环,而不是从c开始循环,因为此时c的值为i。
5.在第二个while循环中,应该输出完所有数字后再输出换行符,而不是在最后一个数字后输出退格符。
6.在最后一个else语句中,不需要添加分号。
以下是修改后的程序:
#include<stdio.h>
int main()
{
    int num,a,c=0;
    int i=0;
    int b[6];
    
    scanf("%!d(MISSING)",&num);
    a=num;
    
    while(a>0) //修改1
    {
        a=a/10;
        i++;
    }
    
    if(i<=5){
        printf("%!d(MISSING)\n",i);
        a=num;
        do
        {
            b[c]=a%!;(MISSING)
            a=a/10;
            c++;
        }while(a>0); //修改2
        
        while(c>0){ //修改4
            c--;
            printf("%!d(MISSING) ",b[c]);
        }
        printf("\n"); //修改5
        
        c=0;
        while(c<i){
            printf("%!d(MISSING)",b[c]);
            c++;
        }
    }
    else{ //修改6
        printf("error\n");
    }
    return 0;
} 
至于如何优化,这道题目的思路比较简单,基本没有优化的余地。不过可以考虑使用递归的方式实现,这样会更加简洁。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-28 13:32:53 | 显示全部楼层
歌者文明清理员 发表于 2023-3-27 20:41
您好,这道题目的要求是将一个整数的每一位数倒序输出,您的程序的思路基本正确,但是在输出时有一些小问题 ...
#include<stdio.h>
int main()
{
    int num,a,c=0;
    int i=0;
    int b[6];
    
    scanf("%d",&num);
    a=num;
    
    while(a>0) //修改1
    {
        a=a/10;
        i++;
    }
    
    if(i<=5){
        printf("%d\n",i);
        a=num;
        do
        {
            b[c]=a%10;
            a=a/10;
            c++;
        }while(a>0); //修改2
        
        while(c>0){ //修改4
            c--;
            printf("%d  ",b[c]);
        }
        printf("\b\n"); //修改5
        
        c=0;
        while(c<i){
            printf("%d",b[c]);
            c++;
        }
    }
    else{ //修改6
            ;
    }
    return 0;
} 
你好,我还是没有修改好,没有通过测试,请问如何修改?
请问你的代码%!d(MISSING)是什么意思?
printf("error\n");这个可能不能通过测试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 09:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表