`
lovnet
  • 浏览: 6720017 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

HDU 1271 整数对

 
阅读更多

题目链接:Click here~~

题意:

给你一个数n,找到另外一个数x,使得x加上x'等于n,其中,x'为x删去某一位(如第k位,假设最低位为第0位)上的数字后余下数字组成的数。

解题思路:

对于任意一个数字x,在此题环境下,我们都可以把它分解成3部分,k位左边部分,k位部分,k位右边部分。

为了方便起见,我们把这三部分所对应的数字分别记为a,b,c。

则我们可以把x表示成a*10^(k+1) + b*10^k + c,类似地,把x‘表示成a*10^k + c。

从而很容易地,x+x'可以表示成(11*a+b)*10^k + 2*c,由于题目要求找到满足x+x'=n的x,所以我们只需要把n分成上述式子的形式,找到符合条件的a,b,c即可。

需要注意的是,a,b,c需要满足的条件有:

1、b是0~9的某一数字。

2、所求的b的值可能并不是真正的b的值。

因为2*c可能大于10^k,从而使得b的值比真正的b的值多1,由于b本身最大是9,加1后最大是10,而a的系数是11,所以进位不会影响a的值。

3、a、b不能同时为0。

因为当a为0的时候说明k一定在最高位,而一个数的最高位不可能是0(0除外)。

Ps:熟悉了下list的剔除重复元素的用法,呵呵。

#include <list>
#include <stdio.h>
#include <algorithm>
using namespace std;
int main()
{
    int n,a,b,c,x;
    list <int> l;
    list <int>::iterator it;
    while(scanf("%d",&n),n)
    {
        l.clear();
        for(int k=1;k<=n;k*=10)
        {
            a = n/k / 11;
            b = n/k % 11;
            if(a + b && b < 10)
            {
                c = (n - 11*a*k - b*k) / 2;
                x = 11*a*k + b*k + 2*c;
                if(n == x)
                    l.push_back(x);
            }
            b--;
            if(a + b && b >= 0)
            {
                c = (n - 11*a*k - b*k) / 2;
                x = 11*a*k + b*k + 2*c;
                if(n == x)
                    l.push_back(x);
            }
        }
        if(l.size()==0)
            puts("No solution.");
        else
        {
            l.sort();
            l.unique();
            it = l.begin();
            printf("%d",*it);
            for(it=++it;it!=l.end();it++)
                printf(" %d",*it);
            printf("\n");
        }
    }
    return 0;
}




分享到:
评论

相关推荐

    fft算法实现大整数乘法

    已 AC HDU 1402,利用fft算法实现大整数乘法

    HDU——ACM.zip

    本压缩包内包含杭电ACM集训的课件PPT,较为详细的介绍了动态规划,计算几何,贪心算法, 搜索,二分图及其应用,母函数及其应用,组合博弈入门,并查集,递推求解等常用算法

    【题解】「HDU1166」敌兵布阵(线段树)

    (1)Add(1) Add(1)Add iii jjj,iii和jjj为正整数,表示第iii个营地增加jjj个人(jjj不超过303030) (2)Sub(2)Sub(2)Sub iii jjj ,iii和jjj为正整数,表示第iii个营地减少jjj个人(jjj不超过303030); (3)Query(3)...

    hdoj1002——大整数相加

    杭州电子科技大学hdoj1002,大整数相加问题

    leetcode下载-algorithm-1:力扣、HDU、ZOJ、POJ

    欢迎Coders对代码加以指正和提议! 常见问题总结 两整数求平均值 average = min + (max - min) / 2 防止两整数的和越界 整数乘积对比 1.0 * m * m == num 类似乘积对比, 需转为double型, 避免整数溢出 两整数交换 ...

    HDU-Coder-X#Daily-question-of-Leetcode#2022-02-26-2016. 增量元素之间的最

    2016. 增量元素之间的最大差值题目描述:给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i]

    HDU5667 Sequence

    首先附上题目链接 ... 题目分析 像这种递推公式的问题,n很大...那么可以用矩阵快速幂的方式 求解 k(n) f(n) = ak(n)再通过整数快速幂的方式求解。 还有一个问题:k(n)很大 直接求幂肯定连int64_t都要溢出 那么运用费马小

    C++中约数定理的实例详解

    对于一个大于1正整数n可以分解质因数:n = p1^a1*p2^a2*……pk^ak,则n的正约数的个数就是 :(a1+1)*(a2+1)*……*(ak+1) 其中a1、a2、a3…ak是p1、p2、p3,…pk的指数。 用这个定理求一个数的约数个数是非常快的...

    leetcode下载-campus_recruitmen_questions:2021年最新整理,5000道秋招/提前批/春招/常用面试题,包

    3.DP+四边形不等式优化(hdu 3506 Monkey Party) 4.快餐(hoj 1005 fast food) 5.hoj 1031完全背包Piggy-Bank 6.数字金字塔(hoj 1058Number Triangles) 7.肥猫的表亲(hoj 1061Fat Cat's cousin II) 8.加建楼梯...

    kuangbin acm模板超级好用

    2.18.1 HDU4656 卷积取模 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.19 其它公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.19.1 Polya . . . ....

Global site tag (gtag.js) - Google Analytics