Code forces 376 C Divisible by Seven

来源:互联网 发布:詹姆斯职业生涯数据 编辑:程序博客网 时间:2024/04/29 14:06

给出一个字符串,其中至少包含1,6,8,9各一个及其他数字若干,

要求重新排列这个字符串,使得它表示的数可以被7整出,不允许前导零。

如果不存在输出0.


1689四个数变换位置可以有24种可能,

然后打了一个从1689到100000的表,看看符合条件的数的特点。

#include<stdio.h>int ask(int x){    int f1=0,f2=0,f3=0,f4=0;    while(x){        if(x%10==1)f1=1;        if(x%10==6)f2=1;        if(x%10==8)f3=1;        if(x%10==9)f4=1;        x/=10;    }    if(f1+f2+f3+f4==4)return 1;    else return 0;}int main(){    for(int i=1689;i<=100000;i++){        int tp=i;        int flag=ask(tp);        if(i%7==0&&flag)printf("%d\n",i);    }    return 0;}
设最终的合法的数为[num][1689](1689位置可能会换)中num无论是0123456中谁都有合法的解。

那么,将给的字符串处理一下,去掉第一个出现的1,6,8,9,再记录并且跳过前导零,然后输出剩下的,并且计算出他们%7的余数,然后根据余数输出一个和[1689]凑整的排列,再输出之前记录的前导零即可。

#include<stdio.h>#include<string.h>char str[1111111],ans[1111111];int main(){    while(scanf("%s",&str)!=EOF){        int f1=1,f6=1,f9=1,f8=1;        int tp=0,len=strlen(str);        int tot=0;        for(int i=0;i<len;i++){            if(f1&&str[i]=='1'){                f1--;continue;            }            if(f6&&str[i]=='6'){                f6--;continue;            }            if(f9&&str[i]=='9'){                f9--;continue;            }            if(f8&&str[i]=='8'){                f8--;continue;            }            ans[tot++]=str[i];            tp=(tp*10+str[i]-'0')%7;        }        int ling=0,flag=0;        for(int i=0;i<tot;i++){            if(!flag&&ans[i]=='0')ling++;            else {printf("%c",ans[i]),flag++;}        }        if(tp==0)printf("1869");        else if(tp==1)printf("6198");        else if(tp==2)printf("1896");        else if(tp==3)printf("6981");        else if(tp==4)printf("1986");        else if(tp==5)printf("1968");        else if(tp==6)printf("1698");        for(int i=0;i<ling;i++)printf("0");        printf("\n");    }    return 0;}



0 0
原创粉丝点击