杭電acm1271 整數對
阿新 • • 發佈:2018-12-27
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.
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; }