codeFores375A

来源:互联网 发布:ubuntu install pip 编辑:程序博客网 时间:2024/06/17 06:51

思路:构造法

将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;}}


0 0
原创粉丝点击