整数对

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.

一开始的错误解法:超时
#include<iostream>
#include<string>
#include<sstream>
#include<math.h>
using namespace std;
void find(const string s,const long n)
{
 int k=pow(10,(s.size()-2)),ju=0,p;
 for(int i=k*9;i<=n;i++)
 {
  string s1;
  stringstream str;
  str<<i;str>>s1;str.clear();
  for(int j=1;j<=s1.size();j++)
  {
   int w;
   p=i/(int)pow(10,j);
   w=p*pow(10,j-1)+i%(int)pow(10,j-1);
   if((i+w)==n)
   {
    if(ju==1)
     cout<<" "<<i;
    else
     cout<<i;
    ju=1;
    break;
   }
  }
 }
 if(ju==0)
  cout<<"No solution.";
}
int main()
{
 long n;
 string s;
 stringstream str;
 while(cin>>n&&n)
 {
  str<<n;str>>s;
  str.clear();
  find(s,n);
  cout<<endl;
 }
 return 0;
}
经过借鉴网上的解答,得出:k从0位开始
我们可以把X 分解成:X= a+b * 10^k +c * 10^( k+1 );  这里特别强调一下, a代表的是比第k位后面的低位数子,可能是多位,b仅仅代表一个数值,即你选择拿开的那位数,c代表的是比k位高的高位数字,例如:12345 您想拿走3的话 这时候a=45,c=12,b=3;   然后拿走之后就会组合成另一个数:Y=a + c * 10^k; 然后X+Y=2 * a + b * 10 ^k +11 * c * 10^k;现在如果N=X+Y;他必定满足上面那种结构!所以我们考虑这种结构特征就可以了,首先上述表达式的低位是2*a 可能发生进位!所以b的值可能是10,但是 都不影响c的值, 这个时候只需要分两种不同的b的情况,来求出a,然后验证一下 是不是等于N就可以了
 
正确解答:
#include<iostream>
#include<set>
using namespace std;
void find(const int n)
{
 set<int> st;
 int c,b,a,hi,ju=0;//hi为比b高的位,
 for(int k=1;k<=n;k*=10)
 {
  hi=n/k;
  c=(hi/11)*k;
  b=hi%11;
  if((c!=0||b!=0)&&b<10)
  {
   b*=k;
   a=(n-c*11-b)/2;
   if((2*a+b+11*c)==n)
   {
    st.insert(a+b+10*c);
    ju=1;
   }
  }
  b=hi%11-1;
  if((c!=0||b!=0)&&b>=0)
  {
   b*=k;
   a=(n-c*11-b)/2;
   if((2*a+b+11*c)==n)
   {
    ju=1;
    st.insert(a+b+10*c);
   }
  }
 }
 if(ju==0)
  cout<<"No solution."<<endl;
 else
 {
  set<int>::iterator it=st.begin();           
  cout<<*it;          
  while(++it!=st.end())              
   printf(" %d",*it);
  cout<<endl;
 }
}
int main()
{
 int n;
 while(cin>>n&&n)
 {
  find(n);
 }
 return 0;
}
 

你可能感兴趣的:(搜索,整数对,杭电大学,1271)