鱼C论坛

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

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

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

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

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

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

  16.        
  17.         if(i<=5){
  18.         printf("%d\n",i);
  19.         a = num;
  20.         do
  21.         {
  22.                 b[c] = a % 10 ;
  23.                 a = a / 10;
  24.                 c++;
  25.         }while(a >= 10);
  26.        
  27.         b[c] = a;
  28.                
  29.         while(c>=0){
  30.                 printf("%d",b[c]);
  31.                 printf(" ");
  32.                 c--;
  33.         }
  34.         printf("\b\n");
  35.        
  36.         c = 0;
  37.         while(c<=i-1){
  38.                 printf("%d",b[c]);
  39.                 c++;
  40.         }
  41. }
  42.         else{
  43.                 ;
  44.         }
  45.         return 0;
  46. }
复制代码
最佳答案
2023-3-27 20:31:44
本帖最后由 柿子饼同学 于 2023-3-27 20:43 编辑

可以用字符串

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

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

  3. char num[8];
  4. int len;

  5. int main(){

  6.     scanf("%s", num);

  7.     len = strlen(num);

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

  13.     printf("\n");

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

  17.     return 0;
  18. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

可以用字符串

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

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

  3. char num[8];
  4. int len;

  5. int main(){

  6.     scanf("%s", num);

  7.     len = strlen(num);

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

  13.     printf("\n");

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

  17.     return 0;
  18. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int num, a, c = 0;
  5.     int i = 1;
  6.     int b[5];

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

  9.     while (a >= 10)
  10.     {
  11.         a = a / 10;
  12.         i++;
  13.     }

  14.     if (i <= 5)
  15.     {
  16.         printf("%d\n", i);
  17.         a = num;
  18.         while (a > 0)
  19.         {
  20.             b[c] = a % 10;
  21.             a = a / 10;
  22.             c++;
  23.         }

  24.         for (int j = i - 1; j >= 0; j--)
  25.         {
  26.             printf("%d", b[j]);
  27.             if (j != 0)
  28.                 printf(" ");
  29.         }
  30.         printf("\n");

  31.         for (int j = 0; j < i; j++)
  32.         {
  33.             printf("%d", b[j]);
  34.         }
  35.         printf("\n");
  36.     }
  37.     else
  38.     {
  39.         ;
  40.     }
  41.     return 0;
  42. }
复制代码
小甲鱼最新课程 -> https://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语句中,不需要添加分号。
以下是修改后的程序:
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int num,a,c=0;
  5.     int i=0;
  6.     int b[6];
  7.    
  8.     scanf("%!d(MISSING)",&num);
  9.     a=num;
  10.    
  11.     while(a>0) //修改1
  12.     {
  13.         a=a/10;
  14.         i++;
  15.     }
  16.    
  17.     if(i<=5){
  18.         printf("%!d(MISSING)\n",i);
  19.         a=num;
  20.         do
  21.         {
  22.             b[c]=a%!;(MISSING)
  23.             a=a/10;
  24.             c++;
  25.         }while(a>0); //修改2
  26.         
  27.         while(c>0){ //修改4
  28.             c--;
  29.             printf("%!d(MISSING) ",b[c]);
  30.         }
  31.         printf("\n"); //修改5
  32.         
  33.         c=0;
  34.         while(c<i){
  35.             printf("%!d(MISSING)",b[c]);
  36.             c++;
  37.         }
  38.     }
  39.     else{ //修改6
  40.         printf("error\n");
  41.     }
  42.     return 0;
  43. }
复制代码

至于如何优化,这道题目的思路比较简单,基本没有优化的余地。不过可以考虑使用递归的方式实现,这样会更加简洁。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-28 13:32:53 | 显示全部楼层
歌者文明清理员 发表于 2023-3-27 20:41
您好,这道题目的要求是将一个整数的每一位数倒序输出,您的程序的思路基本正确,但是在输出时有一些小问题 ...
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int num,a,c=0;
  5.     int i=0;
  6.     int b[6];
  7.    
  8.     scanf("%d",&num);
  9.     a=num;
  10.    
  11.     while(a>0) //修改1
  12.     {
  13.         a=a/10;
  14.         i++;
  15.     }
  16.    
  17.     if(i<=5){
  18.         printf("%d\n",i);
  19.         a=num;
  20.         do
  21.         {
  22.             b[c]=a%10;
  23.             a=a/10;
  24.             c++;
  25.         }while(a>0); //修改2
  26.         
  27.         while(c>0){ //修改4
  28.             c--;
  29.             printf("%d  ",b[c]);
  30.         }
  31.         printf("\b\n"); //修改5
  32.         
  33.         c=0;
  34.         while(c<i){
  35.             printf("%d",b[c]);
  36.             c++;
  37.         }
  38.     }
  39.     else{ //修改6
  40.             ;
  41.     }
  42.     return 0;
  43. }
复制代码

你好,我还是没有修改好,没有通过测试,请问如何修改?
请问你的代码%!d(MISSING)是什么意思?
printf("error\n");这个可能不能通过测试。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-11 10:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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