描述
某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入
包含n+1行:
第1行是整数n(1<=n<=200000),表示自然数的个数。
第2~n+1行每行一个自然数。
输出
包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
样例输入
8242451002100
样例输出
2 34 25 1100 2
题目来源
090824210
快排吧直接,计数用二维数组实现。↓
1 #include <stdio.h> 2 3 void soort(long* a,long left,long right); 4 int main() 5 { 6 long n,i,j; 7 while(scanf("%ld",&n)!=EOF) 8 { 9 long ret[200000]={0}; 10 for(i=0;i<n;i++) scanf("%ld",&ret[i]); 11 soort(ret,0,n-1); 12 long sum[10000][2]={0}; 13 sum[0][0]=ret[0]; 14 sum[0][1]=1; 15 for(i=1,j=0;i<n;i++) 16 { 17 if(ret[i]==ret[i-1]) sum[j][1]++; 18 else 19 { 20 sum[++j][0]=ret[i]; 21 sum[j][1]++; 22 } 23 } 24 for(i=0;i<10000;i++) if(sum[i][1]) printf("%ld %ld\n",sum[i][0],sum[i][1]); 25 } 26 return 0; 27 } 28 void soort(long* a,long left,long right) 29 { 30 if(left>=right) return; 31 long temp; 32 long i = left; 33 long j = right; 34 long key = a[left]; 35 while(i<j) 36 { 37 while(i<j&&key<=a[j]) j--; 38 temp = a[i]; 39 a[i]=a[j]; 40 a[j]=temp; 41 while(i<j&&key>=a[i]) i++; 42 temp = a[i]; 43 a[i] = a[j]; 44 a[j] = temp; 45 } 46 soort(a,left,i-1); 47 soort(a,i+1,right); 48 }
时间: 2024-11-06 23:13:51