如何生成各位数字之和为21的7位数?现有代码结果不符求助
问题分析与修复方案
代码中的核心问题
- 数组越界访问:
num是长度为7的数组,索引范围为0~6,但代码中使用num[7] = sum,会访问数组外的内存,导致未定义行为,最终sum的赋值完全错误。 - 最后一位数字有效性未校验:前6位生成时未限制总和,可能导致剩余的
sum小于1或大于9,这样最后一位不是有效的单个数字(7位数的每一位都必须是1-9之间的数,首位也不能为0)。 - 数字拼接逻辑错误:最后循环中
number += num[i]是把各位数字相加,而非拼接成7位数,与需求不符。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { // 初始化随机数种子,保证每次运行生成不同随机数 srand((unsigned int)time(NULL)); int number = 0; int sum = 21; int num[7]; // 生成前6位,确保剩余sum在1~9之间 for (int i = 0; i < 6; i++) { // 计算当前位最大可能值:不能超过9,且要保证剩余位数(含当前位)的最小总和(每一位至少1) int min_remaining = 6 - i; // 剩余(6-i)位每一位至少为1的总和 int max_val = sum - min_remaining > 9 ? 9 : sum - min_remaining; num[i] = (rand() % max_val) + 1; sum -= num[i]; } // 最后一位赋值为剩余sum,此时sum必然在1~9范围内 num[6] = sum; // 拼接成7位数 for (int i = 0; i < 7; i++) { number = number * 10 + num[i]; } // 验证各位数字之和 int check_sum = 0; int temp = number; while (temp > 0) { check_sum += temp % 10; temp /= 10; } printf("生成的7位数:%d\n", number); printf("各位数字之和:%d\n", check_sum); return 0; }
关键修复说明
- 加入随机数种子初始化,避免每次运行生成相同序列的数字。
- 生成前6位时限制最大值,确保最后一位是1-9之间的有效数字。
- 修正数组索引,使用
num[6]赋值最后一位,避免越界。 - 用
number = number * 10 + num[i]正确拼接各位数字为7位数。 - 添加总和验证逻辑,方便确认结果符合要求。
内容的提问来源于stack exchange,提问作者furybowser
相关产品推荐
相关产品推荐

