趣味数字

题目 趣味数字

image-7cad5ae8

思路分析

image-43c1a5b7

20位 longlong也会爆

得用高精度

加倍可以理解成两个相加 也可以理解成乘2

所以用高精度加也行高精度乘也行

一个地方在于怎么判断加倍以后得到的数字是否可以由原数字的各数位重新排列得到

一开始想的是 用一个数组 值做下标计数 记录出现几次 如果每个数都只出现一次就满足

但这样一来逻辑就复杂了很多

其实可以直接将原数组和结果数组进行一个排序 再比较是否相等即可

因为每个数的不重复的 且在范围内的

代码实现

加法实现

#include<bits/stdc++.h>

using namespace std;

vector<int> add(vector<int>&A,vector<int>&B)

{

    vector<int> C;

    int t=0;

    for(int i=0;i<A.size()||i<B.size();i++)

    {

        if(i<A.size())

            t+=A[i];

        if(i<B.size())

            t+=B[i];

        C.push_back(t%10);

        t/=10;

    }

    if(t)

        C.push_back(1);

    return C;

}

int main()

{

    string a;

    cin>>a;

    vector<int> A;

    for(int i=a.size()-1;i>=0;i--)

        A.push_back(a[i]-'0');

    auto C=add(A,A);

    auto copyc=C;

    sort(A.begin(),A.end()),sort(copyc.begin(),copyc.end());

    if(A==copyc)

        cout<<"Yes"<<endl;

    else

        cout<<"No"<<endl;

    for(int i=C.size()-1;i>=0;i--)

        cout<<C[i];

    return 0;

}

乘法实现

#include<bits/stdc++.h>

using namespace std;

vector<int> mul(vector<int>&A,int b)

{

    vector<int> C;

    int t=0;

    for(int i=0;i<A.size()||t;i++)

    {

        if(i<A.size())

            t+=A[i]*b;

        C.push_back(t%10);

        t/=10;

    }

    return C;

}

int main()

{

    string a;

    cin>>a;

    vector<int> A;

    for(int i=a.size()-1;i>=0;i--)

        A.push_back(a[i]-'0');

    auto C=mul(A,2);

    auto copyc=C;

    sort(A.begin(),A.end()),sort(copyc.begin(),copyc.end());

    if(A==copyc)

        cout<<"Yes"<<endl;

    else

        cout<<"No"<<endl;

    for(int i=C.size()-1;i>=0;i--)

        cout<<C[i];

    return 0;

}

同类题型

视频讲解


⬅️ 大数运算 🏠 00-刷题理模型 ➡️ 高精度相关问题