[PAT解题报告] Have Fun with Numbers

简单题, 给定一个整数(20位),问他的二倍是否和它组成的数字相同。
由于整数已经超过了long long, C++用数组模拟大整数加法,java可以直接使用bigInteger。
数组模拟整数加法,就是每个数组存一位数,就像我们笔算加法一样,注意进位就可以了。然后数组里面每一位就是结果。
比较数字显然可以排序,另外一种办法是记录每种数字(0-9)出现的次数之差,最后如果全0,显然就是组成的数字相同了。

代码:
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

char s[100];
int a[100],b[100],num[10];;

int main() {
    scanf("%s",s);
    int n = strlen(s);
    for (int i = 0; i < n; ++i) {
        a[i] = s[n - 1 - i] - '0';
    }
    for (; n && (a[n - 1] == 0); --n)
    ;
    for (int i = 0; i < n; ++i) {
        b[i] += (a[i] << 1);
        if (b[i] >= 10) {
            b[i] -= 10;
            ++b[i + 1];
        }
        ++num[a[i]];
        --num[b[i]];
    }
    if (b[n]) {
        --num[b[n++]];
    }
    
    bool mark = true;
    for (int i = 0; i < 10; ++i) {
        if (num[i]) {
            mark = false;
        }
    }
    puts(mark?"Yes":"No");
    for (--n; n >= 0; --n) {
        printf("%d",b[n]);
    }
    puts("");
    return 0;
}

原题链接: http://www.patest.cn/contests/pat-a-practise/1023

全部评论

相关推荐

头像
11-09 17:30
门头沟学院 Java
TYUT太摆金星:我也是,好几个华为的社招找我了
点赞 评论 收藏
分享
去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务