conniesarah
经常有点小迷糊
2020-12-13 09:04
采纳率: 66.7%
浏览 7

为什么这段代码超时了两个点?(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
    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;
    
    点赞 评论

相关推荐