数论
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
给出一个数N,含有数字1,2,3,4.把N的所有位数重新排列一下组成一个新数,使得它是7的倍数。
Input
第一行测试数据的总数T(T<=10000)。
接下来T行每行一个整数N,N不超过20位。
Output
如果存在这样的排列则随便输出一个符合的排列。
否则输出0.
Sample Input
2
1234
531234
Sample Output
4123
354123
//听说是腾讯某次面试题,有意思。错了很多次 Orz
由1 2 3 4 组成的排列可以余7为 0-6 所以,无论给的什么符合要求的数,都可以余7为0
举个栗子
a1b2c3d4
把 1 2 3 4 拿出来
使得该数字变为 abcd0000 不管余多少 加上一个 1234 的排列补充就好
数字很大,不能 long long 要当字符串处理
然而,还有个坑,如果除了1234都是0呢,所以,abcd 要降序排序一下,再去求 abcd0000 的余
还有,如果 str[0] 还是0 就得输出 1234 的一个排列余 7 为 0 的再把 0 输出
31ms
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 #include <algorithm> 5 using namespace std; 6 7 int cmp(char x,char y) 8 {return x>y;} 9 10 const int remain[7]={3241,3214,3124,2341,2314,1342,2134}; 11 12 int Yu7(char str[]) 13 { 14 int len = strlen(str); 15 int y=0; 16 for(int i=0;i<len;i++) 17 { 18 y+=str[i]-'0'; 19 y%=7; 20 y*=10; 21 } 22 y/=10; 23 return y; 24 } 25 26 int main() 27 { 28 int T; 29 char str[25]; 30 char real[25]; 31 scanf("%d",&T); 32 while (T--) 33 { 34 scanf("%s",&str); 35 int ti[5]={0}; 36 int i,len = strlen(str); 37 int e,s=0; 38 for (i=0;i<len;i++) 39 { 40 e=str[i]-'0'; 41 //抽出四个数1234 42 if (e<=4&&e>=1&&ti[e]==0) 43 { 44 ti[e]=1; 45 continue; 46 } 47 real[s++]=str[i]; 48 } 49 sort(real,real+s,cmp); 50 for (i=0;i<4;i++) 51 real[s++]='0'; 52 real[s++]='\0'; 53 int yu = Yu7(real); 54 if (yu==0) yu=7; 55 len-=4; 56 real[len]='\0'; 57 if (real[0]!='0') 58 printf("%s%d\n",real,remain[7-yu]); 59 else 60 printf("%d%s\n",remain[0],real); 61 } 62 return 0; 63 }