题解 P6209 【「SWTR-04」Calculating Machine】

· · 题解

这道题其实跟高精度的模拟类似,但是唯一不同的是逢七进一,且每位上的数字是0-9。那么如何进行模拟呢?首先需要知道这道题的进位特点。

\color{white}-\color{black}12\color{white}-------\color{black}75 \color{black}+13\color{white}------\color{black}+73 ---\color{white}-----\color{black}--- \color{white}-\color{black}25\color{white}-------\color{black}258 \color{black}\textbf{不进位}\color{white}-----\color{black}\textbf{进位}

知道这一点后,我们就可以开始模拟。为了方便,我们把个位放在前面。又因为数据比较大,所以我们采用字符串式处理。

for(int j = 0;j < now;j++) num[now - 1 - j] = a[i][j] - '0';//加数 
for(int j = 0;j <= max(wei,now);j++)
{
    if(i == 1) k = 0;//第一个加数自己不用进位处理 
    ans[j] += k + num[j];//加法 
    k = ans[j] / 7;//进位 
    ans[j] %= 10;//每一位在0-9之间 
}

我们可以发现,在两数相加之后,还有可能不停进位,产生新的一个数位,所以我们要判断k是否还存在进位数字。

while(k != 0)//还需进位 
{
            //继续模拟加法 
    ans[++now] += k + num[now];
    k = ans[now] / 7;
    ans[now] %= 10;
}
wei = max(wei,now);//保存最大长度 

最后就是输出了,把前导的0去掉是关键!直接我们做加法的时候是个位在前面,所以输出的时候要记得在调转回来。

while(ans[wei] == 0) wei--;//去除前导零 
if(wei < 0) cout<<0<<endl;//等于0的情况特判 
else
{
    for(int i = wei;i >= 0;i--) cout<<ans[i];//正常输出 
    cout<<endl;
}

贴一下完整代码:

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
string a[2025];
int ans[2025],num[2025];
int main()
{
    int n,k = 0,wei = 0;
    cin>>n;
    for(int i = 1;i <= n;i++) cin>>a[i]; 
    for(int i = 1;i <= n;i++)
    {
        k = 0;
        memset(num,0,sizeof(num));//初始化
        int now = a[i].size();//当前加数的长度
        for(int j = 0;j < now;j++) num[now - 1 - j] = a[i][j] - '0';//加数 
        for(int j = 0;j <= max(wei,now);j++)
        {
            if(i == 1) k = 0;//第一个加数自己不用进位处理 
            ans[j] += k + num[j];//加法 
            k = ans[j] / 7;//进位 
            ans[j] %= 10;//每一位在0-9之间 
        }
        now = max(wei,now);
        while(k != 0)//还需进位 
        {
            //继续模拟加法 
            ans[++now] += k + num[now];
            k = ans[now] / 7;
            ans[now] %= 10;
        }
        wei = max(wei,now);//保存最大长度 
    }
    while(ans[wei] == 0) wei--;//去除前导零 
    if(wei < 0) cout<<0<<endl;//等于0的情况特判 
    else
    {
        for(int i = wei;i >= 0;i--) cout<<ans[i];//正常输出 
        cout<<endl;
    }
    return 0;
}