题意:题意还是有些问题的!很明显这是一个多组解的题目,但题目并没有注明输出答案之一就可。
注意题目“You have number a, whose decimal representation quite luckily contains digits 1, 6, 8, 9. Rearrange the digits in its decimal representation so that the resulting number will be divisible by 7.” 中的 the digits!! 意思只能重拍这1689这几个数字。
长度是10^6,不能暴力,所以就换种角度。一个数%7 不在乎就0-6这几种情况……所以重排1689这几个数字去消掉前面的%7的余数!
第一遍做的时候就手工去组合,因为粗心白白错了好几次。
后来发现,有计算机的时代还用手工?!蠢!
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char str[1000010];
bool vis[1000010];
int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%s",str))
{
int find[5]={0};
int len=strlen(str);
int num=0,ans,res=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<len;i++)
{
if(str[i]=='1'&&!find[0]) find[0]=1,vis[i]=1;
else if(str[i]=='8'&&!find[1]) find[1]=1,vis[i]=1;
else if(str[i]=='9'&&!find[2]) find[2]=1,vis[i]=1;
else if(str[i]=='6'&&!find[3]) find[3]=1,vis[i]=1;
else if(str[i]=='0')num++,vis[i]=1;
}
for(int i=0;i<len;i++)
if(vis[i]==0)
{
printf("%c",str[i]);
res=res*10+str[i]-'0';
res%=7;
}
char p[]="1689";
do{
ans=res;
for(int i=0;i<4;i++)
ans=ans*10+p[i]-'0',ans=ans%7;
if(ans==0) break;
}while(next_permutation(p,p+4));
printf("%s",p);
for(int i=0;i<num;i++) printf("0");
puts("");
}
return 0;
}