XDOJ数字排序

题目6:数字排序
问题描述
  给定n个整数,请计算每个整数各位数字和,按各位数字和从大到小的顺序输出。
输入格式
  输入的第一行包含一个整数n,表示给定数字的个数。
  第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
  输出多行,每行包含两个整数,分别表示一个给定的整数和它的各位数字和。按各位数字和递减的顺序输出。如果两个整数各位数字和相同,则先输出值较小的,然后输出值较大的。
样例输入
5
101 100 999 1234 110
样例输出
999 27
1234 10
101 2
110 2
100 1
评测用例规模与约定
  1 ≤ n ≤ 1000,给出的数都是不超过10000的非负整数。

#include
#include
int sum(int x)
{
     
	int i,a[5],t,su=0;
	for(i=0;i<5;i++)
	{
     
		t=x/pow(10,i);
		a[i]=t%10;
	}
	for(i=0;i<5;i++)
	su+=a[i];
	return su;
	 
}
int a[1000][2];
int main()
{
     
	int i,j,t,n,b;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
     
		scanf("%d",&a[i][0]);
		a[i][1]=sum(a[i][0]);
	}
	for(i=0;i<n-1;i++)
	for(j=0;j<n-1-i;j++)
	{
     
		if(a[j][1]<a[j+1][1])
		{
     
			t=a[j][1];
			a[j][1]=a[j+1][1];
			a[j+1][1]=t;
			t=a[j][0];
			a[j][0]=a[j+1][0];
			a[j+1][0]=t;
		}
		if(a[j][1]==a[j+1][1])
		{
     
			if(a[j][0]>a[j+1][0])//更换两次值即可
			{
     
				t=a[j][1];
		    	a[j][1]=a[j+1][1];
			    a[j+1][1]=t;
			    t=a[j][0];
			    a[j][0]=a[j+1][0];
			    a[j+1][0]=t;
			}
		}
	}
	for(i=0;i<n;i++)
	printf("%d %d\n",a[i][0],a[i][1]);
	return 0;
}

你可能感兴趣的:(XDOJ,算法)