鱼C论坛

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

[已解决]为什么某数的各位和计算会有问题

[复制链接]
发表于 2022-11-19 11:38:36 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int n;scanf("%d",&n);int a[n],b[n];
  5.         int i,j,temp=0;
  6.         for(i=0;i<n;i++)
  7.         {
  8.                 scanf("%d",&a[i]);
  9.         }
  10.         for(i=0;i<n;i++)//这个循环求出a[i]的各位之和 ---b[i]
  11.         {
  12.                 temp=a[i];
  13.                 for(;temp!=0;)
  14.                 {
  15.                         b[i]+=temp%10;
  16.                         temp/=10;
  17.                 }
  18.                 printf("%d\n",b[i]);
  19.         }
  20.         for(i=0;i<n;i++)     //以b[j]为比较给a[j],b[j]排序
  21.         {
  22.                 for(j=0;j<n-1;j++)
  23.                 {
  24.                         if(b[j]>b[j+1])
  25.                         {
  26.                                 temp=b[j];
  27.                                 b[j]=b[j+1];
  28.                                 b[j+1]=temp;
  29.                                 temp=a[j];
  30.                                 a[j]=a[j+1];
  31.                                 a[j+1]=temp;
  32.                                
  33.                         }
  34.                 }
  35.         }
  36.         for(j=0;j<n-1;j++)    //出现b[i]==b[i+1]这类情况是比较a[i]谁小谁在前
  37.         {
  38.                 if(b[j]==b[j+1]&&a[j]>a[j+1])
  39.                 {
  40.                                 temp=b[j];
  41.                                 b[j]=b[j+1];
  42.                                 b[j+1]=temp;
  43.                                 temp=a[j];
  44.                                 a[j]=a[j+1];
  45.                                 a[j+1]=temp;
  46.                 }
  47.         }
  48.         for(i=0;i<n;i++)
  49.         {
  50.                 printf("%d %d\n",a[i],b[i]);//最后b[i]由小到大 的顺序输出
  51.         }
  52.         return 0;
  53.        
  54. }
复制代码

给定n个整数,请计算每个整数各位数字和,按各位数字和从小到大的顺序输出。
512.png
最佳答案
2022-11-19 12:12:42
本帖最后由 jackz007 于 2022-11-19 12:47 编辑

             b[ i ] 累加前没有初始化
  1.                 temp = a[i] ;
  2.                 for(b[i] = 0 ; temp != 0 ;)  // 修改这一句,累加前,必须先把 b[i] 初始化为 0 值,非常很重要!你代码问题的病根在此。
  3.                 {
  4.                         b[i]+=temp%10;
  5.                         temp/=10;
  6.                 }
复制代码

            还有这里
  1.                 if(b[j]==b[j+1]&&a[j]>a[j+1])
  2.                 {
  3.                                 temp=b[j];            // 既然 b[j] == b[j + 1],那么,这又是在干什么呢?还有必要交换吗?
  4.                                 b[j]=b[j+1];          // 既然 b[j] == b[j + 1],那么,这又是在干什么呢?还有必要交换吗?
  5.                                 b[j+1]=temp;          // 既然 b[j] == b[j + 1],那么,这又是在干什么呢?还有必要交换吗?
  6.                                 temp=a[j];
  7.                                 a[j]=a[j+1];
  8.                                 a[j+1]=temp;
  9.                 }
复制代码

          这是我修改的代码,谨供楼主参考
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.         int i , j , k , n                                              ;
  5.         scanf("%d", & n)                                               ;
  6.         int a[n] , b[n]                                                ;
  7.         for(i = 0 ; i < n ; i ++) {
  8.                 scanf("%d", & a[i])                                    ;
  9.                 for(b[i] = 0 , k = a[i] ;  k ; k /= 10) b[i] += k % 10 ;
  10.         }
  11.         for(i = 0 ; i < n - 1 ; i ++) {
  12.                 for(j = 1 ; j < n - i ; j ++) {
  13.                         if(b[j] < b[j - 1]) {
  14.                                 k = b[j - 1]                           ;
  15.                                 b[j - 1] = b[j]                        ;
  16.                                 b[j] = k                               ;
  17.                         }
  18.                 }
  19.         }
  20. /*
  21.         printf("%d" , a[0])                                            ;
  22.         for(i = 1 ; i < n ; i ++) printf(" %d" , a[i])                 ;
  23.         printf("\n")                                                   ;
  24. */
  25.         printf("%d" , b[0])                                            ;
  26.         for(i = 1 ; i < n ; i ++) printf(" %d" , b[i])                 ;
  27.         printf("\n")                                                   ;
  28. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-19 12:12:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-19 12:47 编辑

             b[ i ] 累加前没有初始化
  1.                 temp = a[i] ;
  2.                 for(b[i] = 0 ; temp != 0 ;)  // 修改这一句,累加前,必须先把 b[i] 初始化为 0 值,非常很重要!你代码问题的病根在此。
  3.                 {
  4.                         b[i]+=temp%10;
  5.                         temp/=10;
  6.                 }
复制代码

            还有这里
  1.                 if(b[j]==b[j+1]&&a[j]>a[j+1])
  2.                 {
  3.                                 temp=b[j];            // 既然 b[j] == b[j + 1],那么,这又是在干什么呢?还有必要交换吗?
  4.                                 b[j]=b[j+1];          // 既然 b[j] == b[j + 1],那么,这又是在干什么呢?还有必要交换吗?
  5.                                 b[j+1]=temp;          // 既然 b[j] == b[j + 1],那么,这又是在干什么呢?还有必要交换吗?
  6.                                 temp=a[j];
  7.                                 a[j]=a[j+1];
  8.                                 a[j+1]=temp;
  9.                 }
复制代码

          这是我修改的代码,谨供楼主参考
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.         int i , j , k , n                                              ;
  5.         scanf("%d", & n)                                               ;
  6.         int a[n] , b[n]                                                ;
  7.         for(i = 0 ; i < n ; i ++) {
  8.                 scanf("%d", & a[i])                                    ;
  9.                 for(b[i] = 0 , k = a[i] ;  k ; k /= 10) b[i] += k % 10 ;
  10.         }
  11.         for(i = 0 ; i < n - 1 ; i ++) {
  12.                 for(j = 1 ; j < n - i ; j ++) {
  13.                         if(b[j] < b[j - 1]) {
  14.                                 k = b[j - 1]                           ;
  15.                                 b[j - 1] = b[j]                        ;
  16.                                 b[j] = k                               ;
  17.                         }
  18.                 }
  19.         }
  20. /*
  21.         printf("%d" , a[0])                                            ;
  22.         for(i = 1 ; i < n ; i ++) printf(" %d" , a[i])                 ;
  23.         printf("\n")                                                   ;
  24. */
  25.         printf("%d" , b[0])                                            ;
  26.         for(i = 1 ; i < n ; i ++) printf(" %d" , b[i])                 ;
  27.         printf("\n")                                                   ;
  28. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-19 15:44:31 | 显示全部楼层
jackz007 发表于 2022-11-19 12:12
b[ i ] 累加前没有初始化

            还有这里


按你的提示修改后,程序对了,但是在学校系统上提交后,总有一个用例过不了。程序的哪里有问题,我把
b ==b[i+1]==b[i+2]的情况下a的排序也考虑了,加入后也不对。

给定n个整数,请计算每个整数各位数字和,按各位数字和从大到小的顺序输出。
输入格式
  输入的第一行包含一个整数n,表示给定数字的个数。
  第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
  输出多行,每行包含两个整数,分别表示一个给定的整数和它的各位数字和。按各位数字和递减的顺序输出。如果两个整数各位数字和相同,则先输出值较小的,然后输出值较大的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-19 15:45:23 | 显示全部楼层
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int n;scanf("%d",&n);int a[n],b[n];
  5.         int i,j,temp=0;
  6.         for(i=0;i<n;i++)
  7.         {
  8.                 scanf("%d",&a[i]);
  9.         }
  10.         for(i=0;i<n;i++)//这个循环求出a[i]的各位之和 ---b[i]
  11.         {
  12.                 b[i]=0;   //因为没有初始化数组这一步,最初一个小时没做出来。
  13.                 temp=a[i];
  14.                 for(;temp!=0;)
  15.                 {
  16.                         b[i]+=temp%10;
  17.                         temp/=10;
  18.                 }
  19.         }
  20.         for(i=0;i<n;i++)     //以b[j]为比较给a[j],b[j]排序
  21.         {
  22.                 for(j=0;j<n-1;j++)
  23.                 {
  24.                         if(b[j]<b[j+1])
  25.                         {
  26.                                 temp=b[j];
  27.                                 b[j]=b[j+1];
  28.                                 b[j+1]=temp;
  29.                                 temp=a[j];
  30.                                 a[j]=a[j+1];
  31.                                 a[j+1]=temp;
  32.                                
  33.                         }
  34.                 }
  35.         }
  36.         for(j=0;j<n-1;j++)    //出现b[i]==b[i+1]这类情况是比较a[i]谁小谁在前
  37.         {
  38.                 if(b[j]==b[j+1]&&a[j]>a[j+1])
  39.                 {
  40.                                 temp=a[j];
  41.                                 a[j]=a[j+1];
  42.                                 a[j+1]=temp;
  43.                 }
  44.         }
  45.         for(j=0;j<n-2;j++)
  46.         {
  47.                 if(b[j]==b[j+1]&&b[j+1]==b[j+2])//条件不能有两个连等,必须分开写。
  48.                 {
  49.                         if(b[j]>b[j+1])
  50.                         {
  51.                                 temp=b[j];b[j]=b[j+1];b[j+1]=temp;
  52.                         }
  53.                         if(b[j]>b[j+2])
  54.                         {
  55.                                 temp=b[j];b[j]=b[j+2];b[j+2]=temp;
  56.                         }
  57.                         if(b[j+1]>b[j+2])
  58.                         {
  59.                                 temp=b[j+1];b[j+1]=b[j+2];b[j+2]=temp;
  60.                         }
  61.                 }
  62.         }
  63.         for(i=0;i<n;i++)
  64.         {
  65.                 printf("%d %d\n",a[i],b[i]);
  66.         }
  67.         return 0;
  68.        
  69. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-19 15:47:51 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-19 16:14 编辑

        也不早一点贴要求
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.         int i , j , k , n                                              ;
  5.         scanf("%d", & n)                                               ;
  6.         int a[n] , b[n]                                                ;
  7.         for(i = 0 ; i < n ; i ++) {
  8.                 scanf("%d", & a[i])                                    ;
  9.                 for(b[i] = 0 , k = a[i] ;  k ; k /= 10) b[i] += k % 10 ;
  10.         }
  11.         for(i = 0 ; i < n - 1 ; i ++) {
  12.                 for(j = 1 ; j < n - i ; j ++) {
  13.                         if(b[j] > b[j - 1]) {
  14.                                 k = b[j - 1]                           ;
  15.                                 b[j - 1] = b[j]                        ;
  16.                                 b[j] = k                               ;
  17.                         }
  18.                         if(b[j] == b[j - 1] && a[j] < a[j - 1]) {
  19.                                 k = a[j - 1]                           ;
  20.                                 a[j - 1] = a[j]                        ;
  21.                                 a[j] = k                               ;
  22.                         }
  23.                         
  24.                 }
  25.         }
  26.         for(i = 0 ; i < n ; i ++) printf("%d %d\n" , b[i] , a[i])      ;
  27. }
复制代码

        编译运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 5
  4. 123 321 222 141 132
  5. 6 123
  6. 6 132
  7. 6 141
  8. 6 222
  9. 6 321

  10. D:\[00.Exerciese.2022]\C>x
  11. 6
  12. 321 567 231 135 432 111
  13. 18 321
  14. 9 231
  15. 9 567
  16. 6 135
  17. 6 432
  18. 3 111

  19. D:\[00.Exerciese.2022]\C>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 05:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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