阿克劳斯 2020-09-11 21:59 采纳率: 100%
浏览 160
已采纳

C++中循环语句加入打印可跳出,不加打印会卡死

代码所要解决的题

# 我写的代码为:

#include <algorithm>
#include <cstdio>
#include <iostream>

using namespace std;
const int N = 4;
const int lis[] = { 1000, 100, 10, 1 };

bool compare(int a, int b) {
    return a > b;
}

int conv(char s1[], int n) {
    int ans;
    for (int i = 0; i < n; i++) {
        ans += (s1[i] - '0') * lis[i];
    }
    return ans;
}

int main(void) {
    char s[10];
    int dif, a1, a2, time = 0, tmp;
    cin >> s;

    while (1) {
        sort(s, s + N, compare);
        a1 = conv(s, N);

        sort(s, s + N);
        a2 = conv(s, N);

        dif = a1 - a2;

        // cout<<"a1:  "<<a1<<endl;
        // cout<<"a2:  "<<a2<<endl;
        //cout << "dif: " << dif << endl;

        time++;
        if (dif == 6174)
            break;

        for (int i = 3; i >= 0; i--) {
            s[i] = '0' + dif % 10;
            dif /= 10;
        }
    }
    cout << time;
    getchar();
    getchar();
    return 0;
}

直接运行,输入样例运行会卡死
但是如果加入对中间过程变量的打印语句(即代码中注释掉的部分),程序便可以正常运行。
甚至于,如果在while循环体中,加入任意的打印语句(如换行符,空格,制表符等等),都可以使程序不卡死,求解
(我知道解这道题有更简单的方法,但是我想知道这种写法卡死的原因,谢谢大佬)

  • 写回答

2条回答 默认 最新

  • 裔远 2020-09-12 15:58
    关注

    conv中,写ans=0;
    我调试了一下,发现不输出是因为dif根本不为6174,是ans没有初始化的原因。
    写完ans=0就能正常输出。
    而写输出语句ans就=0;???
    可能是内存释放?

    int conv(char s1[], int n){
        int ans=0;//不加输出语句不会清零
        for (int i = 0; i < n; i++) {
            ans += (s1[i] - '0') * lis[i];
        }
        return ans;
    }
    
    

    如果问题解决请采纳

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?