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
相关产品推荐
相关产品推荐

