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

C++按星星总数输出递减星形图案的代码错误排查

问题分析与修复

你的代码存在三个核心错误:

  • 变量作用域错误:while(n>0)中的n此时未定义,C++不允许用未初始化的变量做条件判断,会触发未定义行为。
  • 非法修改循环控制变量:内层for循环里的n--直接篡改了输入的总星星数,彻底打乱外层循环的终止条件,导致输出逻辑完全混乱。
  • 逻辑方向错误:原代码是按行数控制输出,而你需要的是累计星星总数不超过输入值的递减图案,两者核心逻辑完全不同。

正确实现思路

要实现“基于星星总数n的递减星形”,核心是先找到最大的整数k,使得k+(k-1)+...+1 ≤n,然后从k开始递减输出每行的星号,直到剩余星星不足以输出下一行(比如输入5时,3+2=5,所以输出3个和2个星号)。

修复后的代码

#include<iostream>   
using namespace std; 

int main() { 
    int n;
    // 循环输入正整数,输入非正数时退出
    while(cin >> n && n > 0){
        // 找到最大的k,满足1+2+...+k ≤n
        int k = 0;
        while((k+1)*(k+2)/2 <= n){
            k++;
        }
        // 从k开始递减输出每行星号
        for(int i = k; i >= 1; i--){
            if(n >= i){
                for(int j = 0; j < i; j++){
                    cout << "*";
                }
                cout << endl;
                n -= i;
            } else {
                break;
            }
        }
    }        
    return 0; 
}

代码说明

  1. 先通过循环计算最大的k值,确保前k个正整数的和不超过输入的n。
  2. 从k开始逐行输出星号,每输出一行就从n中扣除对应数量的星星,直到剩余星星不足以输出下一行。
  3. 修正了变量作用域问题,用cin >>n &&n>0控制循环输入逻辑。

测试你的示例场景:

  • 输入6:输出***、**、*(3+2+1=6)
  • 输入5:输出***、**(3+2=5)
  • 输入15:输出*****、****、***、**、*(5+4+3+2+1=15)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:40:20