思路:构造法
将1、6、8、9取出来,因为1689的排列所有除7的余数都能得到,所以可以将其他的数放在最前面,然后后面的缺几就用1689的排列去补充就够了。举例:P为1689的排列,xxxP%7=((xxx0000%7)+(P%7))%7,求出xxx0000%7的余数为5的话,那么构造一个P使得(P%7)余2就能够使这个数被7整除了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string f[7]=
{
"1869","1968","1689",
"6198","8691","8916","1896"
};
int vis[10];
int main(){
string ch,st="";
int i,j;
cin>>ch;
memset(vis,0,sizeof(vis));
for(i=0;i<ch.size();i++){
if(ch[i]=='1'){
if(!vis[1]) vis[1]=1;
else st+=ch[i];
}else if(ch[i]=='6'){
if(!vis[6]) vis[6]=1;
else st+=ch[i];
} else if(ch[i]=='8'){
if(!vis[8]) vis[8]=1;
else st+=ch[i];
}else if(ch[i]=='9'){
if(!vis[9]) vis[9]=1;
else st+=ch[i];
}else st+=ch[i];
}
int flag=0;
for(i=0;i<st.size();i++) if(st[i]!='0'){
flag=1;
char g=st[i];
st[i]=st[0];
st[0]=g;
}//解决前导是0的问题,如果不写会出错
if(!flag){
cout<<f[0]<<st<<endl;
}else{
int t=0;
for(i=0;i<st.size();i++){
t=(t*10+st[i]-'0')%7;
}
for(i=0;i<4;i++){
t=(t*10+'0'-'0')%7;
}
if(t) t=7-t;
cout<<st<<f[t]<<endl;
}
}