1 条题解

  • 0
    @ 2025-8-24 22:18:34

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar SUNCHAOYI
    报名个人赛 https://www.luogu.com.cn/contest/44296

    搬运于2025-08-24 22:18:34,当前版本为作者最后更新于2020-03-14 11:04:08,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    这道题其实跟高精度的模拟类似,但是唯一不同的是逢七进一,且每位上的数字是090-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之间 
    }
    

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

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

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

    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;
    }
    
    • 1

    信息

    ID
    4586
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者