给定n个正整数,根据各位数字之和从小到大进行排序。
输入格式:
输入数据有多组,每组数据占一行,每行的第一个数正整数n,表示整数个数,后面接n个正整数。当n为0时,不作任何处理,输入结束。n<=10。
输出格式:
输出每组排序的结果。
输入样例:
3 230 59 110
5 199 220 108 235 120
0
输出样例:
在这里给出相应的输出。例如:
110 230 59
120 220 108 235 199
思路:先将数字存入数组1里,再把分离的每一位相加之和存到数组2里;
比较 数组2的哪个数字大调换位置,并调换平行数组1里每个数的位置
最后输出调换后的数组1里的数
#include<stdio.h>
int main()
{
int a[10],b[10],c[10];//设置三个数组,a是原始数组,b是用来保存a数组中每个数各位数之和,c数组与a数组一样(a数组后来的数会变);
int n,i,j,k,x,t;
while(scanf("%d",&n)&&n!=0)
{
for(i=0;i<n;i++)/输入a数组并把a数组里的每一个数复制到c数组中
{
scanf("%d",&a[i]);
c[i]=a[i];
}
for(i=0;i<n;i++)//分离a数组的每一位数并保存在b数组中,下标是对应的
{
b[i]=0;//b数组是用来计数的,所以初始值为零
while(a[i]>0)
{
x=a[i]%10;
b[i]+=x;
a[i]/=10;
}
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(b[i]>b[j])//a,b,c的下标是对应的,b中哪个数调换了c中的那个数就调换
{
t=b[i];
b[i]=b[j];
b[j]=t;
t=c[i];//a数组的值在分离时就变了,用相同的c数组代替
c[i]=c[j];
c[j]=t;
}
}
}
for(i=0;i<n;i++)//有多组输入,注意输出格式
{
if(i==n-1)
printf("%d\n",c[i]);
else
printf("%d ",c[i]);
}
}
return 0;
}