hdu 1271 整数对

看完题,没啥思路。

网上的大牛讲解如下:

        

  假设删掉第k位为数字B,前面的数字段为A,后面的数字段为C,则有:

  n=A*10^(k+1) + B*10^k + c

  m=A*10^k + c

 N=n+m=(11A+B)*10^k + 2c

    有:A=N/10^k/11B可能被2c进位,故分为两种情况:

1.     B=N/10^k – 11A && 2c < 10^k//2c未进位

2.     B=N/10^k – 11A – 1 && 2c >=10^k //2c进位

遍历k的可能值(0N的位数)便可将所有n求出,排序输出即可。

 

#include<stdio.h>

#include<string.h>

#include<math.h>

#include<stdlib.h>

#include<iostream>

#include<algorithm> 

#include<queue>

#define PI3.1415926535897932384626433832795

using namespace std;

int s[500];

int cmp(const void*a,const void *b)

{

        return *(int *)a-*(int *)b;   

}

int main()

{

        int n,k,i;

        int a,b,c,num;

        while(scanf("%d",&n),n)

        {

               num=0;

               for(k=1;k<=n;k*=10)

               {

                       c=n/k/11;

                       b=n/k-11*c;

                       if((b!=0 || c!=0)&& b<10)

                       {

                               a=(n-(11*c+b)*k)/2;

                               if(11*c*k+b*k+2*a==n)

                               {

                                      num++;

                                      s[num]=c*k*10+b*k+a;

                                       //printf(" %d",s[num]);      

                               }      

                       }

                       b--;

                       if((b!=0||c!=0)&& b>=0)

                       {

                               a=(n-(11*c+b)*k)/2;

                               if(11*c*k+b*k+2*a==n)

                               {

                                      num++;

                                      s[num]=c*k*10+b*k+a;

                                       //printf(" %d",s[num]);      

                               }      

                       }      

               }      

               if(num==0)

                       printf("Nosolution.\n");

               else

               {

                       qsort(&s[1],num,sizeof(s[0]),cmp);

                       printf("%d",s[1]);

                       for(i=2;i<=num;i++)

            {

                if(s[i]!=s[i-1])

                printf(" %d",s[i]);

            }

            printf("\n");     

               }

        }      

}

 

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值