PAT 甲级 1023 Have Fun with Numbers (20 分) C++大数

博主分享了一篇关于如何使用C++的__int128类型解决大数问题的文章。通过一道具体的题目,展示了__int128在处理大数运算时的优势,并提到虽然不能直接读入和输出,但可以借助string进行转换。最终成功AC了题目,并提醒读者__int128对于避免整数溢出非常有用。
摘要由CSDN通过智能技术生成

题目传送门
昨天有个大佬把java甩我脸上,告诉我说这道题C++麻烦死了,又没有大数。一开始我还以为真的没有,直到acm群里一个大佬说C++有大数啊,是__int128。于是乎,我今天就用把C++的大数ac了这个题~跟大家分享:

//
// Created by 曾仕邦 on 2021/7/12.
//
#include "bits/stdc++.h"
using namespace std;
int main(){
    __int128 a =0,b;
    string s;cin>>s;
    int hash[10]={0};
    for (int i = 0; i < s.length(); ++i) {
        hash[s[i]-'0']++;
        if (i!=0) a*=10;
        a+=s[i]-'0';
    }
    a = b = 2*a;
    while (b){
        hash[b%10]--;
        b/=10;
    }
    s.clear();
    while (a){
        char d = a%10+'0';
        s+=d;
        a/=10;
    }
    for (int i = 0; i < s.length()/2; ++i)  swap(s[i],s[s.length()-i-1]);
    for (int i = 0; i < 10; ++i) {
        if (hash[i]){
            cout<<"No"<<endl<<s;
            return 0;
        }
    }
    cout<<"Yes"<<endl<<s;
}

这个__int128呢基本上不会爆掉,int有的操作它基本都有。唯一的麻烦就是不能直接读入或者输出,需要用string自己写方法互相转换~

希望文章对你有帮助。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值