14的倍数

来源:互联网 发布:淘宝哪些不需要保证金 编辑:程序博客网 时间:2024/04/29 18:36

FJNU.1970

Description
给出一个正整数N,含数字1、2、3、4,把N的所有数字重新排列组成一个新数,要求是14的倍数且最低四位是1、2、3、4的排列的最大整数。

Input
第一行含一个正整数k,为所需计算的实例个数。从第2行到第k+1行,各包含一个整数N(104<N<109).

Output
对应每个实例输出一行,每行含一个整数,表示满足条件的最大整数。

Sample Input
2
654321
1234

Sample Output
653142
4312

Source
福建师范大学第五届程序设计竞赛

My Program

#include<iostream>
using namespace std;

void Check(long n)
{
    
int a[10]={0},k=0;
    
int i,j;
    
long m=0;
    
while(n>0)
    
{
        a[n
%10]++;
        n
/=10;
        k
++;
    }

    a[
4]--;
    a[
3]--;
    a[
2]--;
    a[
1]--;
    
for(i=9;i>=0;i--)
        
for(j=0;j<a[i];j++)
            m
=m*10+i;
    m
*=10000;
    
switch(m%14)
    
{
    
case 1:m+=4213;break;
    
case 2:m+=1342;break;
    
case 3:m+=1243;break;
    
case 4:m+=3412;break;
    
case 5:m+=4321;break;
    
case 6:m+=3214;break;
    
case 7:m+=4123;break;
    
case 8:m+=3142;break;
    
case 9:m+=3421;break;
    
case 10:m+=2314;break;
    
case 11:m+=4231;break;
    
case 12:m+=4132;break;
    
case 13:m+=2143;break;
    
default:m+=4312;
    }

    cout
<<m<<endl;
}


int main()
{
    
int k;
    
long *n;
    
int i;
    cin
>>k;
    n
=new long[k];
    
for(i=0;i<k;i++)
        cin
>>n[i];
    
for(i=0;i<k;i++)
        Check(n[i]);
    
return 0;
}

YOYO's Note:
 数学题。有一个数学公理是这样,
假设有一个包含1、2、3、4的N位数,那么它的前N-4位去掉1、2、3、4各一个数字后从大到小排列,最后4位则按1234能组成的余数加,必然能被14整除。
我讲不清楚。比赛的时候MOCHA他们队先做出来这题,
当时我们一直在攻龙珠,一题也没过,看到他们AC就开始想这题,
HXH那时提出说可能前面是最大数,但是我说不会吧 - - || 于是就没试……
然后就一直想排列组合要怎么写……结果到最后还是没有过……
比赛后问了下他们,果然前面是最大数……Orz 对不起你们……

原创粉丝点击