首页 > 代码库 > 数论(数论题)
数论(数论题)
数论
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
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 //抽出四个数123442 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 else60 printf("%d%s\n",remain[0],real);61 }62 return 0;63 }
数论(数论题)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。