1. 程式人生 > >杭電acm1271 整數對

杭電acm1271 整數對

Problem Description
Gardon和小希玩了一個遊戲,Gardon隨便想了一個數A(首位不能為0),把它去掉一個數字以後得到另外一個數B,他把A和B的和N告訴了小希,讓小希猜想他原來想的數字。不過為了公平起見,如果小希回答的數雖然不是A,但同樣能達到那個條件(去掉其中的一個數字得到B,A和B之和是N),一樣算小希勝利。而且小希如果能答出多個符合條件的數字,就可以得到額外的糖果。
所以現在小希希望你編寫一個程式,來幫助她找到儘可能多的解。
例如,Gardon想的是A=31,B=3 告訴小希N=34,
小希除了回答31以外還可以回答27(27+7=34)所以小希可以因此而得到一個額外的糖果。


Input
輸入包含多組資料,每組資料一行,包含一個數N(1<=N<=10^9),檔案以0結尾。


Output
對於每個輸入的N,輸出所有符合要求的解(按照大小順序排列)如果沒有這樣的解,輸出"No solution."


Sample Input

34
152
21
0



Sample Output

27 31 32
126 136 139 141
No solution.

解題思路:本題是一道純粹用暴力解答的題,但是普通的暴力肯定會超時,所以必須要想其它的暴力方法。根據題目所給的資訊,我們注意到A=a+b*10^k+c*10^(k+1)(b是要去掉的數字),B=a+c*10^k,則n=A+B=2*a+b*10^k+11*c*10^k,b是一位數,用10^k就可以得到11c+b,再用11出就可以得到c和b,但是這裡有一個問題,a不會進位,但是2*a會進位,這就會影響剛剛b+11c,但是這並沒關係,因為進位最多為1,當進位為1時,b其實是b+1,但即使b=9,進位後變成10也不會影響到除11得到的c的值,然後再根據2*a進不進位的情況來討論是否b減去1.再求a驗算就行, 迭代k從最低位到最高位,找出所有可能的A就行。

程式碼如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

int main()
{
    int n,a,b,c,num[20];//c高位,b去掉位,a低位。
    while(scanf("%d",&n)!=EOF && n)
    {
        int i = 0;
        for(int k=1;k<=n;k*=10)
        {
            c = (n/k)/11;
            b = n/k-c*11;
            if((b!=0 || c!=0)&&b<10)//不進位的情況
            {
                a = (n-b*k-c*11*k)/2;
                if(2*a + b*k +c*11*k == n)
                {
                    num[i++] = a+b*k+c*10*k;
                }
            }
            b--;//進位減1
            if((b!=0 || c!=0) && b>=0)
            {
                a = (n-b*k-c*11*k)/2;
                if(2*a+b*k+c*11*k == n)
                    num[i++] = a+b*k+c*10*k;
            }
        }
        if(i)
        {
            sort(num,num+i);
            printf("%d",num[0]);
            for(int k = 1;k<i;k++){
                if(num[k] != num[k-1])  printf(" %d",num[k]);
            }
            printf("\n");
        }
        else
            printf("No solution.\n");
    }
    return 0;
}