PTA L1-002 打印沙漏 , 测试点全过! c++实现

  • Post author:
  • Post category:其他



目录


昨天记录的,一手源码。


今天修改的,问了chatGPT,但是它的代码有许多问题,我修改了一些,测试点全过!


昨天记录的,一手源码。

记录一下,

最后一个测试点没过

,将代码发出来,方便大家学习借鉴和指出问题,同时会更新记录。

如果有各位大佬可以指出问题将不胜感激。

以下是一手代码,未参考过任何:

#include<iostream>
using namespace std;

int main() {
    int N, const_num, i, j = 0;
    int const_last_num = 1, temp;
    char sign;
    int record_i, record_j;
    cin >> N >> sign;
    if (N == 0) {        //特殊情况1
        return 0;
    }
    if(N<7){            //特殊情况2
    cout<<sign<<endl;
        cout<<N-1;
        return 0;
    }
                        //计算能够输出的量,i为次数
    for (i = 0, const_num = 1; const_num+2 < N / 2; i++) {
        const_last_num += 2;
        const_num += const_last_num;
    }
    record_i = i; record_j = 0;       //提前赋值
    while (i >= 0) {                  //从最大打印到1
        for (j = record_j; j > 0; j--) {
            cout << " ";
        }
        for (temp = const_last_num; temp > 0; temp--) {
            cout << sign;
        }
        cout << endl;
        record_j++; const_last_num -= 2; i--;
    }
    i = record_i-1;                 //为从1打印到最大做准备
    record_j-=2;
    const_last_num = 3;
    while (i >= 0) {                 //从1打印到最大
        for (j = record_j; j > 0; j--) {
            cout << " ";
        }
        for (temp = const_last_num; temp > 0; temp--) {
            cout << sign;
        }
        cout << endl;
        record_j--; const_last_num += 2; i--;
    }
                                     //打印剩余个数
    cout << (N-(const_num-1)*2-1) << endl;
    return 0;
}

今天修改的,问了chatGPT,但是它的代码有许多问题,我修改了一些,测试点全过!

先上chat的代码:

#include <iostream>
using namespace std;

int main() {
    int n, num = 1, sum = 0;
    char c;
    cin >> n >> c;

    // 处理输入为0的情况
    if (n == 0) {
        cout << 0 << endl;
        return 0;
    }

    // 处理沙漏形状不足6行的情况
    if (n < 7) {
        for (int i = 0; i < n; i++) {
            cout << c;
        }
        cout << endl << 0 << endl;
        return 0;
    }

    // 计算沙漏形状的层数和每层的符号数量
    while (sum + 2 * num <= n) {
        sum += 2 * num;
        num += 2;
    }
    num -= 2;

    // 输出沙漏形状
    int k = 0;
    for (int i = num; i >= 1; i -= 2) {
        for (int j = 0; j < k; j++) {
            cout << " ";
        }
        for (int j = 0; j < i; j++) {
            cout << c;
        }
        cout << endl;
        k++;
    }
    k -= 2;
    for (int i = 3; i <= num; i += 2) {
        for (int j = 0; j < k; j++) {
            cout << " ";
        }
        for (int j = 0; j < i; j++) {
            cout << c;
        }
        cout << endl;
        k--;
    }

    // 输出剩余符号数量
    int remain = n - sum - num;
    cout << remain << endl;

    return 0;
}


思路很清晰不过有一些问题。


我修改后的代码:

#include <iostream>
using namespace std;

int main() {
    int n, num = 1, sum = 1;
    char c;
    cin >> n >> c;

    // 处理输入为0的情况
    if (n == 0) {
        cout << 0 << endl;
        return 0;
    }

    // 处理沙漏形状不足6行的情况
    if (n < 7) {
        cout<<c;
        cout << endl << n-1;
        return 0;
    }
    // 计算沙漏形状的层数和每层的符号数量
    while (sum + 2 * num <= n) {
        if(num!=1){
            sum += 2 * num;
        }
        num += 2;
    }
    num -= 2;

    // 输出沙漏形状
    int k = 0;int j;
    for (int i = num; i >= 1; i -= 2) {
        for (j = 0; j < k; j++) {
            cout << " ";
        }
        for (j = 0; j < i; j++) {
            cout << c;
        }
        cout << endl;
        k++;
    }
    k -= 2;
    for (int i = 3; i <= num; i += 2) {
        for (j = 0; j < k; j++) {
            cout << " ";
        }
        for (j = 0; j < i; j++) {
            cout << c;
        }
        cout << endl;
        k--;
    }

    // 输出剩余符号数量
    int remain = n - sum;
    cout << remain << endl;

    return 0;
}

测试点:



版权声明:本文为yudui666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。