追光THO 发表于 2023-3-27 20:23:57

请问大佬这题怎么写?

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

       
        if(i<=5){
        printf("%d\n",i);
        a = num;
        do
        {
                b = a % 10 ;
                a = a / 10;
                c++;
        }while(a >= 10);
       
        b = a;
               
        while(c>=0){
                printf("%d",b);
                printf(" ");
                c--;
        }
        printf("\b\n");
       
        c = 0;
        while(c<=i-1){
                printf("%d",b);
                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;
int len;

int main(){

    scanf("%s", num);

    len = strlen(num);

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

    printf("\n");

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

    return 0;
}

isdkz 发表于 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;

    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 = a % 10;
            a = a / 10;
            c++;
      }

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

      for (int j = 0; j < i; j++)
      {
            printf("%d", b);
      }
      printf("\n");
    }
    else
    {
      ;
    }
    return 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;
   
    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=a%!;(MISSING)
            a=a/10;
            c++;
      }while(a>0); //修改2
      
      while(c>0){ //修改4
            c--;
            printf("%!d(MISSING) ",b);
      }
      printf("\n"); //修改5
      
      c=0;
      while(c<i){
            printf("%!d(MISSING)",b);
            c++;
      }
    }
    else{ //修改6
      printf("error\n");
    }
    return 0;
}
至于如何优化,这道题目的思路比较简单,基本没有优化的余地。不过可以考虑使用递归的方式实现,这样会更加简洁。

追光THO 发表于 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;
   
    scanf("%d",&num);
    a=num;
   
    while(a>0) //修改1
    {
      a=a/10;
      i++;
    }
   
    if(i<=5){
      printf("%d\n",i);
      a=num;
      do
      {
            b=a%10;
            a=a/10;
            c++;
      }while(a>0); //修改2
      
      while(c>0){ //修改4
            c--;
            printf("%d",b);
      }
      printf("\b\n"); //修改5
      
      c=0;
      while(c<i){
            printf("%d",b);
            c++;
      }
    }
    else{ //修改6
            ;
    }
    return 0;
}
你好,我还是没有修改好,没有通过测试,请问如何修改?
请问你的代码%!d(MISSING)是什么意思?
printf("error\n");这个可能不能通过测试。
页: [1]
查看完整版本: 请问大佬这题怎么写?