PTA |1022 D进制的A+B 分数 20

136 阅读1分钟

PTA | 程序设计类实验辅助教学平台 (pintia.cn)

可以利用拆位法也可以用辗转相处法:

要考虑 输入的A,B为0的情况(题目只说了输入的是非负数)

#include<vector>
#include <iostream>
#include<algorithm>
#include<string>
using  namespace std;
typedef long long LL;
int m[1000];


void sovel(LL sum,int p)
{
    int i=0;
    if(sum==0)
    {
        cout<<0;
        return;
    }

    while (sum != 0) 
    { // 辗转相除法
        m[i] = sum % p;
        sum = sum / p;
        i++;
    }
    
    while(i!=0)
    { 
        i--; //一定要先--,不然会产生未定义行为
         cout<<m[i];
       
    }

  
}
int main()
{
   int a,b,p;
   cin>>a>>b>>p;

    LL sum=a+b;
    sovel(sum,p);
}

二刷

刚开始是这样写的:

image.png

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>v;
void sovel(int x,int D)
{
    while(x)
    {
        v.push_back(x%D);
        x/=D;
        }
    reverse(v.begin(),v.end());
    for(auto  ch:v)
    {
        cout<<ch;
    }
}
int main()
{

    int A,B,D;cin>>A>>B>>D;

    long long sum=A+B;

    sovel(sum,D);
    return 0;
}

后来想想可能是有种情况是0的情况,那么这个时候就不会进入拆分了(不满足条件),我们要手动输出0: 于是就加了一句:

 if(x==0)cout<<0;

image.png