程序员入门水平,贴出代码大家一起进步!
题目
如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”。例如 123 和 51 就是朋友数,因为 1+2+3 = 5+1 = 6,而 6 就是它们的朋友证号。给定一些整数,要求你统计一下它们中有多少个不同的朋友证号。
输入格式:
输入第一行给出正整数 N。随后一行给出 N 个正整数,数字间以空格分隔。题目保证所有数字小于 10^4 。
输出格式:
首先第一行输出给定数字中不同的朋友证号的个数;随后一行按递增顺序输出这些朋友证号,数字间隔一个空格,且行末不得有多余空格。
输入样例:
8
123 899 51 998 27 33 36 12
输出样例:
4
3 6 9 26
思路||总结
- 读入位整数然后将各位求和在排序,确定需要输出的数字的数量然后进行顺序输出。
AC代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int comp(const void *a,const void *b);
int n;
scanf("%d",&n);
int i,num[n+1];
for(i=0;i<n;i++)//各位求和。
{
scanf("%d",&num[i]);
int a=(int)num[i]/1000;
int b=(int)num[i]/100-a*10;
int c=(int)num[i]/10-a*100-b*10;
int d=num[i]-a*1000-b*100-c*10;
num[i]=a+b+c+d;
};
qsort(num,n,sizeof(int),comp);//升序排序。
num[n]=num[n-1];//多余的一位保证下面进行标志的处理过程一致的一致性。
int flag[n+1];
flag[0]=1;//第一位肯定需要输出,标志位设置为1。
int count=1;
for(i=1;i<=n;i++)
if(num[i]==num[i-1])flag[i]=0;
else
{
flag[i]=1;
count++;
};
printf("%d\n",count);
for(i=0;i<n;i++)
if(flag[i]==1)
{
printf("%d",num[i]);
if(--count>0)putchar(' ');
};
return 0;
}
int comp(const void *a,const void *b)
{
return (*(int*)a-*(int*)b);
}