XTU OJ 1328 数码和

题目描述

一个10进制数n在2∼16进制下可以得到的不同的数码和,求在这些数码和中出现次数最多的数码和。 比如20,

进制2345678910111213141516数码10100202110403226242220191817161514数码和2424586421098765

其中数码和2和4分别出现了3次,为最多出现次数。

输入

第一行是一个整数T(1≤T≤1000),表示样例的个数。 以后每行一个整数n(16≤n≤109)。

输出

依次输出各样例的结果,每个样例输出的第一行是最多的次数。
然后,按数码和值的升序依次输出最多次的数码和,每行输出一种。
每行先输出这个数码和的值,然后按进制的顺序输出出现这个数码和的进制,每个值之间用一个空格隔开。

样例输入

3
17
20
1000000000

样例输出

4
5 3 5 7 13
3
2 2 4 10
4 3 5 9
2
34 7 8
 #include
int main()
{
    int i,j,K;//存数码和 
    scanf("%d",&K);
    while(K--)
    {
        int b[17]={0}; //定义数组的时候一定要注意数组越界问题,
                       //之前定义成b[16]就Runtime error了 
        int N,n,n1,m,t,max=0;//进制 ,n1代替n 
        scanf("%d",&n);
        for(i=2,N=2;i<=16,N<=16;i++,N++)
        {
            m=0,n1=n; 
            while(n1>0)
            {
                t=n1%N;
                n1/=N;
                m+=t;
            }
            b[i]=m;//数码和 
        }
        int cnt[200]={0};//最大9个9 
        for(i=2;i<=16;i++)
        {
            cnt[b[i]]++;//记录不同数码和出现次数
            max=max>cnt[b[i]]?max:cnt[b[i]]; 
        }
        printf("%d\n",max);
        for(j=1;j<=199;j++)//数码和 
        {
            if(cnt[j]==max)//数码和出现次数等于最大次数 
            {
                printf("%d",j);//输出出现的最大数码和是多少 
                for(i=2;i<=16;i++) //i是进制 
                {
                    if(b[i]==j)//找到次数最多数码和对应的进制 
                    {
                        printf(" %d",i);
                    }
                }
                    printf("\n");
            }
        }
    }
    return 0;    
} 

你可能感兴趣的:(XTU,OJ,c语言)