整数对 考虑一个数A(首位不为0),把它去掉一个数字以后得到另外一个数B。给出A与B的和N(1<=N<=10^9)编程计算出所有可能的数A,例如A+B=34,则可能是31或者27。 #include <iostream> #include <string> #include <vector> #include <iterator> using namespace std; int cnt = 0; int GenAfterVec(vector<int> SouVec, int del, const vector<int>& BefDelVec) { if (BefDelVec.size() > 0 && BefDelVec[0] >= 5) { int idx = del; while (idx > -1) { if (--SouVec[idx] < 0) SouVec[idx] = 9; else break; --idx; } } int delcnt = 0; for (vector<int>::iterator it = SouVec.begin(); it < SouVec.end(); ) { if (*it == 0) { SouVec.erase(it); ++delcnt; }else break; } for (int fir = 0; fir < 10; ++fir) { vector<int> TmpSouVec = SouVec; vector<int> TgtVec; TgtVec.push_back(fir); for(int i = del - delcnt; i > -1 ; --i) { int sum = TmpSouVec[i]; int cur = TgtVec.front(); if (i == 0 && cur == sum && cur != 0) { cout<<"[ "<<cnt++<<" ] value, delete the "<<TgtVec.size() - 1<<" value: "; copy(TgtVec.begin(),TgtVec.end(),ostream_iterator<int>(cout, "")); copy(BefDelVec.begin(),BefDelVec.end(),ostream_iterator<int>(cout, "")); cout<<endl<<endl; } int pre = 0; if (cur <= sum) pre = sum - cur; else { pre = 10 + sum - cur; int idx = i - 1; while (idx > -1) { if (--TmpSouVec[idx] < 0) TmpSouVec[idx] = 9; else break; --idx; } } TgtVec.insert(TgtVec.begin(), pre); } } return 0; } int GenBefVec(const vector<int>& SouVec, int inc, int del, int lay, vector<int>& BefDelVec) { if (lay == del) { GenAfterVec(SouVec, del, BefDelVec); return 0; } for (int t = 0; t < 2; ++t) { int temp = SouVec[lay] - inc; if (temp % 2) continue; BefDelVec.insert(BefDelVec.begin(), (temp + t * 10) / 2); inc = t; GenBefVec(SouVec, inc, del, lay - 1, BefDelVec); BefDelVec.erase(BefDelVec.begin()); } } int main() { string StrNum; cout<<"Input a Number: "; cin >>StrNum; vector<int> SouVec; for (int i = 0; i < StrNum.length(); ++i) { int temp = StrNum[i] - '0'; if (temp < 0 || temp > 10) { cout<<"Input error, Not a number!"<<endl; return 1; } SouVec.push_back(temp); } for(int del = SouVec.size() - 1; del > -1 ; --del) { vector<int> BefDelVec; GenBefVec(SouVec, 0, del, SouVec.size() - 1, BefDelVec); } return 0; }