hdu 1271 整数对(数学,3级)

整数对

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2109    Accepted Submission(s): 700


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.
 


 

Author
Gardon
 


 

Source
 


 

Recommend
lxj

思路:

x+y*10^k+10^(k+1)*z+x+z^10^k=N

2*x+(11z+y)*10^k=N

N%10^k=2*x;

w=N/10^k; w=11z+y;z=w/11; y=w%11;

 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int mm=1100;
int x,y,n,ans;
int pos,f[mm],ten[11];
void judge(int a,int c,int k)
{
  int z;
  if(c&1)return;
  z=ans=c/2;///low
  x=a/11;///high
  y=a%11;///erase
  if(y<10&&y>=0)
  {
    ans+=(y+11*x)*ten[k]+ans;
    if(ans==n&&(x||y))f[pos++]=ans=(x*10+y)*ten[k]+z;
  }
  --y;
  z=ans=(c+ten[k])/2;
  if(y<10&&y>=0)
  {
    ans+=(y+11*x)*ten[k]+ans;
    if(ans==n&&(x||y))ans=f[pos++]=(y+10*x)*ten[k]+z;
  }
}
int main()
{ ten[0]=1;
  for(int i=1;i<10;++i)
    ten[i]=ten[i-1]*10;
  while(scanf("%d",&n)&&n)
  { pos=0;
    for(int i=0;i<=9;++i)
    {
      judge(n/ten[i],n%ten[i],i);
    }
    sort(f,f+pos);
    if(!pos){printf("No solution.");printf("\n");continue;}
    int last=f[0];
    printf("%d",f[0]);
    for(int i=1;i<pos;++i)
      if(f[i]^last)
      {printf(" %d",f[i]);
      last=f[i];
      }
      printf("\n");
  }
  return 0;
}


 

转载于:https://www.cnblogs.com/nealgavin/p/3205909.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值