uva10624Super Number

来源:互联网 发布:y系列电机数据大全图片 编辑:程序博客网 时间:2024/06/05 03:39

核心问题就是大数取余,开始时竟然没想到。。。理解一种技巧和掌握一种技巧之间还是有一段距离的。。。

为什么我看大神的代码,感觉他的代码其实和我比起来考虑的东西更少,可以说效率会比我低,但大神却有胆量那样写,真的是艺高人胆大啊。。。大神开始只考虑主要矛盾,再解决次要矛盾?

的确啊,看我的代码,感觉我处处都是在担心什么,而看大神的代码,感觉就是信手拈来,怎么舒服怎么写,这就是差距啊。。


#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int N,M,flag;char s[35],map[10][11]={{1,0},{10,0,1,2,3,4,5,6,7,8,9},{5,0,2,4,6,8},{10,0,1,2,3,4,5,6,7,8,9},{5,0,2,4,6,8},{2,0,5},{5,0,2,4,6,8},{10,0,1,2,3,4,5,6,7,8,9},{5,0,2,4,6,8},{10,0,1,2,3,4,5,6,7,8,9},};int next(){    if(N==1)        return 0;    int i,j=1,t;    for(i=N-2;i>=0;i--)    {        t=s[i]+j-'0';        s[i]=t%10+'0';        j=t/10;    }    if(s[0]!='0')        return 1;    return 0;}int is(int cur){    int i,j,t=0;    for(i=0;i<=cur;i++)    {        t=(t*10+s[i]-'0')%(cur+1);    }    //printf("%d %d %s\n",cur,t,s);    if(t==0)        return 1;    else        return 0;}void dfs(int cur){    if(flag==1)        return ;    if(cur==M)    {        flag=1;        return ;    }    int i,j;    for(i=1;i<=map[(cur+1)%10][0];i++)    {        if(cur==0&&map[(cur+1)%10][i]==0)            continue;        s[cur]=map[(cur+1)%10][i]+'0';        if(is(cur))            dfs(cur+1);        if(flag==1)            return ;    }}void solve(){    flag=0;    do    {        dfs(N-1);        if(flag==1)            break;    }while(next());}int main(){    int t,i,j,count=1;    scanf("%d",&t);    while(t--)    {        memset(s,'0',35);        scanf("%d %d",&N,&M);        s[M]=0, s[0]='1';        printf("Case %d: ",count++);        solve();        if(flag==0)            printf("-1\n");        else            puts(s);    }    return 0;}


0 0
原创粉丝点击