经常有点小迷糊 2020-12-13 09:04 采纳率: 96.7%
浏览 20
已采纳

为什么这段代码超时了两个点?(c++)

题目:

读入三个整数,计算三个整数的和。

输入格式
读入三行,每行一个整数。整数的位数不超过 10001000。

输出格式
输出一个整数,表示这三个数的和。

输出时每行末尾的多余空格,不影响答案正确性

要求使用「文件输入输出」的方式解题,输入文件为 abc.in,输出文件为 abc.out

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
int a[3][1005], len[3];
string num[3];
int main() {
    freopen("abc.in", "r", stdin);
    freopen("abc.out", "w", stdout);
    for (int i = 0; i < 3; i++) {
        cin >> num[i];
    }
    for (int i = 0; i < 3; i++) {
        len[i] = num[i].size();
        for (int j = 0; j < len[i]; j++) {
            a[i][j] = num[i][len[i] - 1 - j] - '0';
        }
    }
    for (int i = 1; i < 3; i++) {
        len[0] = max(len[0], len[i]);
        for (int j = 0; j < len[0]; j++) {
            a[0][j] += a[i][j];
        }
    }
    for (int j = 0; j < len[0]; j++) {
        a[0][j + 1] += a[0][j] / 10;
        a[0][j] %= 10;
    }
    while (a[0][len[0]]) {
        a[0][len[0] + 1] += a[0][len[0]] / 10;
        a[0][len[0]] %= 10;
    }
    while (a[0][len[0]]) {
        a[0][len[0] + 1] += a[0][len[0]] / 10;
        a[0][len[0]] %= 10;
        len[0]++;
    }
    for (int i = len[0] - 1; i >= 0; i--) {
        cout << a[0][i];
    }
    cout << endl;
    return 0;
}

测试结果:

测评信息
================================================
测评用例 1:正确通过 [2.000 毫秒,448 KB]
---------------------------
测评用例 2:正确通过 [1.000 毫秒,448 KB]
---------------------------
测评用例 3:运行超时 [3,000.000 毫秒,444 KB]
用例输入:
59380248390522737902399703986576270399917236558147138480460326941378838153543659……
38232545435624283942618270827932577950443597448212430922923475416464599289138936……
95201315424599457304371257529133099316698528678680201965238270710142106445034555……

用例正确输出:
19281410925074647914938923234364194766705936268503977136862207306798554388771715……

你的输出:

---------------------------
测评用例 4:正确通过 [1.000 毫秒,448 KB]
---------------------------
测评用例 5:运行超时 [2,999.000 毫秒,444 KB]

结果
================================================
共 5 组测评用例,通过 3 组。

总分
================================================
6
  • 写回答

1条回答 默认 最新

  • Chinesischguy 2020-12-13 14:53
    关注

    第一个while会死循环吧

    string res;
    reverse(s1.begin(), s1.end());//索引0为个位
    reverse(s2.begin(), s2.end());
    reverse(s3.begin(), s3.end());
    if(s1.size()>s2.size())//按长度排序,方便判断while循环
        swap(s1,s2);
    if(s2.size()>s3.size())
        swap(s1,s2);
    if(s1.size()>s2.size())
        swap(s1,s2);
    int idx=0, add=0;//add表示进位
    while(idx<s1.size()||idx<s1.size()||idx<s1.size()||add!=0)
    {
        if(idx<s1.size())
        {
            int temp=s1[idx]-'0'+s2[idx]-'0'+s3[idx]-'0'+add;
            int add=temp/10;
            res.push_back((temp%10)+'0');
        }
        else if(idx<s2.size())
        {
            int temp=s2[idx]-'0'+s3[idx]-'0'+add;
            int add=temp/10;
            res.push_back((temp%10)+'0');
        }
        else if(idx<s3.size())
        {
            int temp=s3[idx]-'0'+add;
            int add=temp/10;
            res.push_back((temp%10)+'0');
        }
        else
        {
            int temp=add;
            int add=temp/10;
            res.push_back((temp%10)+'0');
        }
        ++idx;
    }
    reverse(res.begin(), res.end());
    cout<<res<<endl;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥50 opencv4nodejs 如何安装
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证