hdu1271-----整数对 数学题
很有技巧的一道数学题。
本题思路:假设要求的数字为A,去除的为第k位,那么按照这个规则,将A划分为三段:高位c,k位b,低位a,则x=a*10^(k+1)+b*10^k+c去除后为B=a*10^k+c,那么n=A+B=(11a+b)*10^k+2c;
但是由于2c有可能带来进位,可能会使b进1,但是不会对a出现影响,那么a就可以直接求出了。再通过a求出b,然后求出c;求c时分进位和没有进位两种情况,记录下来,然后排序一下输出。
View Code
#include<stdio.h> #include<algorithm> using namespace std; int main() { int a,b,c,i,n,ans[201],num; while(scanf("%d",&n)!=EOF&&n) { num=0; for(i=1;i<=n;i*=10) { a=n/i/11; b=n/i-11*a; if(b<10&&(a||b))//a,b都为0时不符合条件 { c=(n-(11*a+b)*i)/2; if(11*a*i+b*i+2*c==n) ans[num++]=a*i*10+b*i+c; } if((--b>=0)&&(a||b))//这里不用else,a,b相同的情况c有可能不同 { c=(n-b*i-a*i*11)/2; if(11*a*i+b*i+2*c==n) ans[num++]=a*i*10+b*i+c; } } if (num==0) printf("No solution."); else { sort(ans,ans+num); printf("%d",ans[0]); for(i=1;i<num;i++) { if(ans[i]!=ans[i-1])//有可能有时进位或不进位结果是一样的,删去结果重复的答案 printf(" %d",ans[i]); } } puts(""); } }


浙公网安备 33010602011771号