鱼C论坛

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

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

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

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

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

x
#include<stdio.h>
int main()
{
        int n;scanf("%d",&n);int a[n],b[n];
        int i,j,temp=0;
        for(i=0;i<n;i++)
        {
                scanf("%d",&a[i]);
        }
        for(i=0;i<n;i++)//这个循环求出a[i]的各位之和 ---b[i] 
        {
                temp=a[i];
                for(;temp!=0;)
                {
                        b[i]+=temp%10;
                        temp/=10;
                }
                printf("%d\n",b[i]);
        }
        for(i=0;i<n;i++)     //以b[j]为比较给a[j],b[j]排序 
        {
                for(j=0;j<n-1;j++)
                {
                        if(b[j]>b[j+1])
                        {
                                temp=b[j];
                                b[j]=b[j+1];
                                b[j+1]=temp;
                                temp=a[j];
                                a[j]=a[j+1];
                                a[j+1]=temp;
                                
                        }
                }
        }
        for(j=0;j<n-1;j++)    //出现b[i]==b[i+1]这类情况是比较a[i]谁小谁在前 
        {
                if(b[j]==b[j+1]&&a[j]>a[j+1])
                {
                                temp=b[j];
                                b[j]=b[j+1];
                                b[j+1]=temp;
                                temp=a[j];
                                a[j]=a[j+1];
                                a[j+1]=temp;
                }
        }
        for(i=0;i<n;i++)
        {
                printf("%d %d\n",a[i],b[i]);//最后b[i]由小到大 的顺序输出 
        }
        return 0;
        
}
给定n个整数,请计算每个整数各位数字和,按各位数字和从小到大的顺序输出。
512.png
最佳答案
2022-11-19 12:12:42
本帖最后由 jackz007 于 2022-11-19 12:47 编辑

             b[ i ] 累加前没有初始化
                temp = a[i] ;
                for(b[i] = 0 ; temp != 0 ;)  // 修改这一句,累加前,必须先把 b[i] 初始化为 0 值,非常很重要!你代码问题的病根在此。
                {
                        b[i]+=temp%10;
                        temp/=10;
                }
            还有这里
                if(b[j]==b[j+1]&&a[j]>a[j+1])
                {
                                temp=b[j];            // 既然 b[j] == b[j + 1],那么,这又是在干什么呢?还有必要交换吗?
                                b[j]=b[j+1];          // 既然 b[j] == b[j + 1],那么,这又是在干什么呢?还有必要交换吗?
                                b[j+1]=temp;          // 既然 b[j] == b[j + 1],那么,这又是在干什么呢?还有必要交换吗?
                                temp=a[j];
                                a[j]=a[j+1];
                                a[j+1]=temp;
                }
          这是我修改的代码,谨供楼主参考
#include<stdio.h>
int main(void)
{
        int i , j , k , n                                              ;
        scanf("%d", & n)                                               ;
        int a[n] , b[n]                                                ;
        for(i = 0 ; i < n ; i ++) {
                scanf("%d", & a[i])                                    ;
                for(b[i] = 0 , k = a[i] ;  k ; k /= 10) b[i] += k % 10 ;
        }
        for(i = 0 ; i < n - 1 ; i ++) {
                for(j = 1 ; j < n - i ; j ++) {
                        if(b[j] < b[j - 1]) {
                                k = b[j - 1]                           ;
                                b[j - 1] = b[j]                        ;
                                b[j] = k                               ;
                        }
                } 
        }
/*
        printf("%d" , a[0])                                            ;
        for(i = 1 ; i < n ; i ++) printf(" %d" , a[i])                 ;
        printf("\n")                                                   ;
*/
        printf("%d" , b[0])                                            ;
        for(i = 1 ; i < n ; i ++) printf(" %d" , b[i])                 ;
        printf("\n")                                                   ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

             b[ i ] 累加前没有初始化
                temp = a[i] ;
                for(b[i] = 0 ; temp != 0 ;)  // 修改这一句,累加前,必须先把 b[i] 初始化为 0 值,非常很重要!你代码问题的病根在此。
                {
                        b[i]+=temp%10;
                        temp/=10;
                }
            还有这里
                if(b[j]==b[j+1]&&a[j]>a[j+1])
                {
                                temp=b[j];            // 既然 b[j] == b[j + 1],那么,这又是在干什么呢?还有必要交换吗?
                                b[j]=b[j+1];          // 既然 b[j] == b[j + 1],那么,这又是在干什么呢?还有必要交换吗?
                                b[j+1]=temp;          // 既然 b[j] == b[j + 1],那么,这又是在干什么呢?还有必要交换吗?
                                temp=a[j];
                                a[j]=a[j+1];
                                a[j+1]=temp;
                }
          这是我修改的代码,谨供楼主参考
#include<stdio.h>
int main(void)
{
        int i , j , k , n                                              ;
        scanf("%d", & n)                                               ;
        int a[n] , b[n]                                                ;
        for(i = 0 ; i < n ; i ++) {
                scanf("%d", & a[i])                                    ;
                for(b[i] = 0 , k = a[i] ;  k ; k /= 10) b[i] += k % 10 ;
        }
        for(i = 0 ; i < n - 1 ; i ++) {
                for(j = 1 ; j < n - i ; j ++) {
                        if(b[j] < b[j - 1]) {
                                k = b[j - 1]                           ;
                                b[j - 1] = b[j]                        ;
                                b[j] = k                               ;
                        }
                } 
        }
/*
        printf("%d" , a[0])                                            ;
        for(i = 1 ; i < n ; i ++) printf(" %d" , a[i])                 ;
        printf("\n")                                                   ;
*/
        printf("%d" , b[0])                                            ;
        for(i = 1 ; i < n ; i ++) printf(" %d" , b[i])                 ;
        printf("\n")                                                   ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

            还有这里


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

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

使用道具 举报

 楼主| 发表于 2022-11-19 15:45:23 | 显示全部楼层
#include<stdio.h>
int main()
{
        int n;scanf("%d",&n);int a[n],b[n];
        int i,j,temp=0;
        for(i=0;i<n;i++)
        {
                scanf("%d",&a[i]);
        }
        for(i=0;i<n;i++)//这个循环求出a[i]的各位之和 ---b[i] 
        {
                b[i]=0;   //因为没有初始化数组这一步,最初一个小时没做出来。 
                temp=a[i];
                for(;temp!=0;)
                {
                        b[i]+=temp%10;
                        temp/=10;
                }
        }
        for(i=0;i<n;i++)     //以b[j]为比较给a[j],b[j]排序 
        {
                for(j=0;j<n-1;j++)
                {
                        if(b[j]<b[j+1])
                        {
                                temp=b[j];
                                b[j]=b[j+1];
                                b[j+1]=temp;
                                temp=a[j];
                                a[j]=a[j+1];
                                a[j+1]=temp;
                                
                        }
                }
        }
        for(j=0;j<n-1;j++)    //出现b[i]==b[i+1]这类情况是比较a[i]谁小谁在前 
        {
                if(b[j]==b[j+1]&&a[j]>a[j+1])
                {
                                temp=a[j];
                                a[j]=a[j+1];
                                a[j+1]=temp;
                }
        }
        for(j=0;j<n-2;j++)
        {
                if(b[j]==b[j+1]&&b[j+1]==b[j+2])//条件不能有两个连等,必须分开写。 
                {
                        if(b[j]>b[j+1])
                        {
                                temp=b[j];b[j]=b[j+1];b[j+1]=temp; 
                        }
                        if(b[j]>b[j+2])
                        {
                                temp=b[j];b[j]=b[j+2];b[j+2]=temp;
                        }
                        if(b[j+1]>b[j+2])
                        {
                                temp=b[j+1];b[j+1]=b[j+2];b[j+2]=temp; 
                        }
                }
        } 
        for(i=0;i<n;i++)
        {
                printf("%d %d\n",a[i],b[i]);
        }
        return 0;
        
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

        也不早一点贴要求
#include<stdio.h>
int main(void)
{
        int i , j , k , n                                              ;
        scanf("%d", & n)                                               ;
        int a[n] , b[n]                                                ;
        for(i = 0 ; i < n ; i ++) {
                scanf("%d", & a[i])                                    ;
                for(b[i] = 0 , k = a[i] ;  k ; k /= 10) b[i] += k % 10 ;
        }
        for(i = 0 ; i < n - 1 ; i ++) {
                for(j = 1 ; j < n - i ; j ++) {
                        if(b[j] > b[j - 1]) {
                                k = b[j - 1]                           ;
                                b[j - 1] = b[j]                        ;
                                b[j] = k                               ;
                        }
                        if(b[j] == b[j - 1] && a[j] < a[j - 1]) {
                                k = a[j - 1]                           ;
                                a[j - 1] = a[j]                        ;
                                a[j] = k                               ;
                        }
                        
                } 
        }
        for(i = 0 ; i < n ; i ++) printf("%d %d\n" , b[i] , a[i])      ;
}
        编译运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
5
123 321 222 141 132
6 123
6 132
6 141
6 222
6 321

D:\[00.Exerciese.2022]\C>x
6
321 567 231 135 432 111
18 321
9 231
9 567
6 135
6 432
3 111

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 16:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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