weixin_45625573
Man1c
采纳率100%
2020-09-11 21:59

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条回答

  • fqyz_student_wyc 裔远 7月前

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

    如果问题解决请采纳

    点赞 评论 复制链接分享
  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 7月前