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

如何生成各位数字之和为21的7位数?现有代码结果不符求助

问题分析与修复方案

代码中的核心问题

  1. 数组越界访问:num是长度为7的数组,索引范围为0~6,但代码中使用num[7] = sum,会访问数组外的内存,导致未定义行为,最终sum的赋值完全错误。
  2. 最后一位数字有效性未校验:前6位生成时未限制总和,可能导致剩余的sum小于1或大于9,这样最后一位不是有效的单个数字(7位数的每一位都必须是1-9之间的数,首位也不能为0)。
  3. 数字拼接逻辑错误:最后循环中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:27:19