You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言冰雹序列代码编译正常但无输出,请求问题排查

冰雹序列程序无输出问题排查

问题背景

冰雹序列规则:偶数时数字减半,奇数时变为3*n+1,最终总会回到1。编写的C语言代码编译无报错,但运行后无任何输出。已在多台电脑测试,将循环上限从1000000改为100后仍无输出,求助排查原因。

附原代码:

#include <stdio.h>
#include <assert.h>
int Longest_Hailstone(void);
int Biggest_Hailstone(void);
long Hailstone_generator(long pre_num);
long Comparison(long a,long current_biggest);

int main(void){
    int current_longgest=Longest_Hailstone();
    long current_biggest=Biggest_Hailstone();
    printf("The biggest Hailstone Number is:%ld",current_biggest);
    printf("The longgest Hailstone Number is:%d",current_longgest);
}

long Hailstone_generator(long pre_num){
    long next_num;
    if(pre_num%2==0){
        next_num=pre_num/2;
    }else{
        next_num=3*pre_num+1;
    }
    return next_num;
}

long Comparison(long a,long current_biggest){
    if(a>current_biggest){
        current_biggest=a;
    }return current_biggest;
}

int Longest_Hailstone(void){
    int intital_num;
    int current_longgest=1;
    int length=0;
    for(intital_num=2;intital_num<=100;intital_num++){
        while(intital_num>1){
            intital_num=Hailstone_generator(intital_num);
            length++;
        }
        current_longgest=Comparison(length,current_longgest);
    }return current_longgest;
}

int Biggest_Hailstone(void){
    int intital_num;
    int current_biggest=1;
    for(intital_num=2;intital_num<=100;intital_num++){
        while(intital_num>1){
            intital_num=Hailstone_generator(intital_num);
            current_biggest=Comparison(intital_num,current_biggest);
    }
}return current_biggest;
}

核心问题分析

程序陷入无限循环,永远到不了printf输出步骤,具体原因:

1. 循环变量被非法修改

Longest_Hailstone和Biggest_Hailstone函数中,for循环的控制变量intital_num被直接用于冰雹序列的计算:

  • 第一次循环处理初始值2时,while循环会把intital_num最终变成1
  • 随后for循环执行intital_num++,变量变成2,再次进入while循环回到1
  • 如此反复,永远无法跳出for循环,程序卡死在这里

2. 其他次要问题

  • Biggest_Hailstone中current_biggest是int类型,但Comparison返回long,类型不匹配可能导致溢出
  • Longest_Hailstone里的length变量没有在每次处理新初始值时重置,会累加所有序列长度,结果错误

修复后的代码

#include <stdio.h>
#include <assert.h>

int Longest_Hailstone(void);
long Biggest_Hailstone(void);
long Hailstone_generator(long pre_num);
long Comparison(long a, long current_biggest);

int main(void){
    int current_longest = Longest_Hailstone();
    long current_biggest = Biggest_Hailstone();
    printf("The biggest Hailstone Number is: %ld\n", current_biggest);
    printf("The longest Hailstone sequence length is: %d\n", current_longest);
}

long Hailstone_generator(long pre_num){
    long next_num;
    if(pre_num % 2 == 0){
        next_num = pre_num / 2;
    }else{
        next_num = 3 * pre_num + 1;
    }
    return next_num;
}

long Comparison(long a, long current_biggest){
    return (a > current_biggest) ? a : current_biggest;
}

int Longest_Hailstone(void){
    int initial_num;
    int current_longest = 1;
    for(initial_num = 2; initial_num <= 100; initial_num++){
        int length = 1; // 初始值自身算长度1
        long temp = initial_num; // 用临时变量处理序列,不修改循环变量
        while(temp > 1){
            temp = Hailstone_generator(temp);
            length++;
        }
        current_longest = (int)Comparison(length, current_longest);
    }
    return current_longest;
}

long Biggest_Hailstone(void){
    int initial_num;
    long current_biggest = 1;
    for(initial_num = 2; initial_num <= 100; initial_num++){
        long temp = initial_num; // 用临时变量处理序列
        while(temp > 1){
            temp = Hailstone_generator(temp);
            current_biggest = Comparison(temp, current_biggest);
        }
    }
    return current_biggest;
}

关键修复点

  • 用临时变量处理冰雹序列,不修改for循环的控制变量,保证循环能遍历所有初始值
  • 每次处理新初始值时重置length,确保每个序列长度统计正确
  • 修正Biggest_Hailstone的变量类型不匹配问题,避免溢出
  • 在printf中添加换行符,确保输出及时刷新显示

内容的提问来源于stack exchange,提问作者Ada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:01:32