HDU 1271

来源:互联网 发布:网络段子精选哲理 编辑:程序博客网 时间:2024/05/16 17:59

题意:一个数A去掉一位后变成B,给出A+B的和N,求所有可能的A


分析:设丢失的是第k位,第k位上的数字数b,前面的数是c,后面的数是a,即A=c^(k+1)+b^k+a;

那么N=c^(k+1)+b^k+a+c^k+a=11*c^k+b^k+2*a;

枚举k,求c,b,a,判断是否符合,2*a可能产生进位,所以b可能等于b-1




#include <iostream>#include<algorithm>#include<cstring>#include<string>#include<cstdio>#define N 20#include<cmath>using namespace std;int l,cnt,num[N],num2[N],ans[N];string str;int tmp;int main(){    int a,b,c,i,j,x,t,k;     while(cin>>str){         cnt=0;         memset(num,0,sizeof(num));         if(str[0]=='0')         break;         l=str.size();         int x=0;         for(i=0;i<l;i++)         x=x*10+str[i]-'0';         for(i=0;i<l;i++){//第i位丢失             t=pow((int)10,(int)i);            tmp=x;            c=tmp/t/11;            b=tmp/t%11;            if((b+c)!=0&&b<10){                a=(tmp-11*t*c-t*b)/2;                if(11*t*c+t*b+2*a==x){                    ans[cnt++]=a+b*t+c*t*10;                }            }            b--;            if((b+c)!=0&&b>=0){                a=(tmp-11*t*c-t*b)/2;                if(11*t*c+t*b+a*2==x){                    ans[cnt++]=a+b*t+c*t*10;                }            }         }         if(!cnt)         printf("No solution.\n");         else {            sort(ans,ans+cnt);            for(i=0;i<cnt-1;i++)            if(ans[i]!=ans[i+1])            printf("%d ",ans[i]);            printf("%d\n",ans[cnt-1]);         }     }    return 0;}


0 0