hdu 1271 整数对

这个题目的思路,是这样的我们假设数字A是这样的一个数字 a*(10^(k+1)) + b*(10^k) + c 其中 a 为任意数字,b为去掉的那一位数字,范围 [0,9] 的整数,c<10^k 。则去掉b后的数字B为 a*(10^k) + c ,而A+B的值可以用一下式子表示 (11*a+b)*(10^k) + 2*c 这个值等于 n , 我们枚举 k的值,从0到10 ,对于取定的k值,显然有一下对应 2*c = n%(10^k) 或者 2*c = n%(10^k) + 10^k ; 可以求出整数c的值,然后枚举 b的值,来确定a的值,使得a的值为整数 /..计算中可能会出现重复的结果,输出是记得要处理一下哦

 

#include < iostream >
#include
< algorithm >
using   namespace  std;
int  re[ 100 ];
int  main()
{
    
int  n,a,i,j,k,num,x,y,temp,tt;

    
while (scanf( " %d " , & n)  && n)
    {
        num 
=   0 ,tt  =   1 ;
        
for (k  = 0 ; k  <=   10 ; k  ++ ){
            
for (j  =   0 ; j  <   2 ; j  ++ ){
                y 
=  n %  tt,x  =  n / tt;
                
if (j  ==   1 )
                    y 
+=  tt,x  -- ;
                
if (x  >   0   &&  y  %   2   ==   0 ){
                    
for (i  =   0 ; i  <=   9 ; i  ++ ){
                        
if ((x - i) % 11   ==   0 ){
                            a 
=  (x - i) / 11 ;
                            temp 
=  tt * (a * 10   + i)  +  y / 2 ;
                            re[num
++ =  temp;    }}}}
            tt 
*=   10 ;
        }
        sort(re,re
+ num);
        
if (num  ==   0 )    printf( " No solution.\n " );
        
else {
            printf(
" %d " ,re[ 0 ]);
            
for (i  = 1 ; i  <  num; i  ++ )
                
if (re[i]  !=  re[i - 1 ])    printf( "  %d " ,re[i]);
            printf(
" \n " );
        }
    }
    
return   0 ;
}

 

转载于:https://www.cnblogs.com/anderson0/archive/2011/05/08/2040308.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值