在 C++ 程序中获得超出的输出限制

问题描述

我正在解决 Weird Algorithm 问题:

考虑一个将正整数 n 作为输入的算法。如果 n 是偶数,算法将其除以二,如果 n 是奇数,则 算法将其乘以三并加一。算法重复 这个,直到 n 是 1。例如,n=3 的序列如下: 3→10→5→16→8→4→2→1

你的任务是模拟给定算法的执行 n 的值。

输入

唯一的输入行包含一个整数 n。

输出

在算法期间打印包含所有 n 值的行。

约束

1≤n≤10^6

问题已解决,但仍面临 OUTPUT LIMIT EXCEED 问题。搜索了很多,但找不到任何方法来摆脱这个问题。 在我输入 = 270271 之前它工作正常,它提供了意外的输出包括负值。

#include <iostream>

using namespace std;
void fun(int n) {
    if (n != 1) {

        if (n % 2 == 0) {
            n = n / 2;
        } else {
            n *= 3;
            n++;
        }

        cout << " " << n;
        fun(n);
    }
}

int main() {

    int n;
    cin >> n;

    cout << " " << n;
    fun(n);

    return 0;
}

enter image description here

解决方法

这里尽量不要使用递归,如果递归深度太大,可能会导致二进制崩溃,而且有时 Collat​​z 序列可能很长,请尝试使用 while 循环。溢出堆栈可能会产生这种超额输出。

此外,在某些输入上,您可能会溢出 int。请改用 uint64_t。就像我下面的代码一样。

完全更正的程序:

Try it online!

#include <iostream>
#include <cstdint>

using namespace std;

void fun(uint64_t n) {
    while (n != 1) {

        if (n % 2 == 0) {
            n = n / 2;
        } else {
            n *= 3;
            n++;
        }

        cout << " " << n;
    }
}

int main() {

    uint64_t n;
    cin >> n;

    cout << " " << n;
    fun(n);

    return 0;
}

输入:

270271 

输出:

 270271 810814 405407 1216222 608111 1824334 912167 2736502 1368251 4104754 2052377 6157132 3078566 1539283 4617850 2308925 6926776 3463388 1731694 865847 2597542 1298771 3896314 1948157 5844472 2922236 1461118 730559 2191678 1095839 3287518 1643759 4931278 2465639 7396918 3698459 11095378 5547689 16643068 8321534 4160767 12482302 6241151 18723454 9361727 28085182 14042591 42127774 21063887 63191662 31595831 94787494 47393747 142181242 71090621 213271864 106635932 53317966 26658983 79976950 39988475 119965426 59982713 179948140 89974070 44987035 134961106 67480553 202441660 101220830 50610415 151831246 75915623 227746870 113873435 341620306 170810153 512430460 256215230 128107615 384322846 192161423 576484270 288242135 864726406 432363203 1297089610 648544805 1945634416 972817208 486408604 243204302 121602151 364806454 182403227 547209682 273604841 820814524 410407262 205203631 615610894 307805447 923416342 461708171 1385124514 692562257 2077686772 1038843386 519421693 1558265080 779132540 389566270 194783135 584349406 292174703 876524110 438262055 1314786166 657393083 1972179250 986089625 2958268876 1479134438 739567219 2218701658 1109350829 3328052488 1664026244 832013122 416006561 1248019684 624009842 312004921 936014764 468007382 234003691 702011074 351005537 1053016612 526508306 263254153 789762460 394881230 197440615 592321846 296160923 888482770 444241385 1332724156 666362078 333181039 999543118 499771559 1499314678 749657339 2248972018 1124486009 3373458028 1686729014 843364507 2530093522 1265046761 3795140284 1897570142 948785071 2846355214 1423177607 4269532822 2134766411 6404299234 3202149617 9606448852 4803224426 2401612213 7204836640 3602418320 1801209160 900604580 450302290 225151145 675453436 337726718 168863359 506590078 253295039 759885118 379942559 1139827678 569913839 1709741518 854870759 2564612278 1282306139 3846918418 1923459209 5770377628 2885188814 1442594407 4327783222 2163891611 6491674834 3245837417 9737512252 4868756126 2434378063 7303134190 3651567095 10954701286 5477350643 16432051930 8216025965 24648077896 12324038948 6162019474 3081009737 9243029212 4621514606 2310757303 6932271910 3466135955 10398407866 5199203933 15597611800 7798805900 3899402950 1949701475 5849104426 2924552213 8773656640 4386828320 2193414160 1096707080 548353540 274176770 137088385 411265156 205632578 102816289 308448868 154224434 77112217 231336652 115668326 57834163 173502490 86751245 260253736 130126868 65063434 32531717 97595152 48797576 24398788 12199394 6099697 18299092 9149546 4574773 13724320 6862160 3431080 1715540 857770 428885 1286656 643328 321664 160832 80416 40208 20104 10052 5026 2513 7540 3770 1885 5656 2828 1414 707 2122 1061 3184 1592 796 398 199 598 299 898 449 1348 674 337 1012 506 253 760 380 190 95 286 143 430 215 646 323 970 485 1456 728 364 182 91 274 137 412 206 103 310 155 466 233 700 350 175 526 263 790 395 1186 593 1780 890 445 1336 668 334 167 502 251 754 377 1132 566 283 850 425 1276 638 319 958 479 1438 719 2158 1079 3238 1619 4858 2429 7288 3644 1822 911 2734 1367 4102 2051 6154 3077 9232 4616 2308 1154 577 1732 866 433 1300 650 325 976 488 244 122 61 184 92 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1