问题 B: 沙漏图形

【题目描述】

输入n,输出正倒n层星号三角形。首行顶格,星号后有一空格,效果见样例

【输入描述】

输入正整数n( 1≤n≤50 )

【输出描述】

输出正倒n层星号三角形,两个三角形共享三角形顶

【输入样例】

3

【输出样例】

* * *
 * * 
  *
 * * 
* * *

【思路及特别提示】

常规题。主要是观察图形规律,每个雪花符号*后面都有一个空格,输入的数字为n,则输出两个顶对顶的三角形,对于上三角,第一行有n个雪花,然后逐行减少,第二行n-1个,直到只有1个雪花的那行,从第二行开始,每行开头出有1个空格,然后逐行递增,下三角的规律与之相反。

【代码】

#include<iostream>
using namespace std;
int main(){
    int i,j,k,n;
    cin>>n;
    for(i=n;i>=1;i--){
        for(k=0;k<n-i;k++){
            cout<<" ";
        }
        for(j=n-i;j<n;j++){
            cout<<"* ";
        }
        cout<<endl;
    }
    for(i=2;i<=n;i++){
        for(k=n-i;k>0;k--){
            cout<<" ";
        }
        for(j=n-i;j<n;j++){
            cout<<"* ";
        }
        cout<<endl;
    }
    return 0;
}
以下是个 Python 实现的解决方案,用于根据输入的偶数表示沙漏行数,并用指定字符输出沙漏图形,每行输出个对应图形且每个输出空行。 ```python def print_sandglass(n, char): # 上半部分 for i in range(n // 2, 0, -1): spaces = (n // 2 - i) stars = 2 * i - 1 print(' ' * spaces + char * stars) # 下半部分 for i in range(1, n // 2 + 1): spaces = (n // 2 - i) stars = 2 * i - 1 print(' ' * spaces + char * stars) while True: try: # 读取输入 line = input().strip() if not line: break n, char = line.split() n = int(n) # 检查输入的 n 是否为偶数 if n % 2 == 0: print_sandglass(n, char) print() except EOFError: break ``` ### 代码解释 1. **`print_sandglass` 函数**:该函数接受两个参数,`n` 表示沙漏的总行数(必须为偶数),`char` 表示用于绘制沙漏的字符。函数内部首先绘制沙漏的上半部分,通过循环控制每行的空数和字符数;然后绘制沙漏的下半部分,同通过循环控制每行的空数和字符数。 2. **主程序**:通过个无限循环不断读取输入,直到遇到空行或文件结束符(EOF)。对于每输入,将其拆分为 `n` 和 `char`,并将 `n` 转换为整数。如果 `n` 是偶数,则调用 `print_sandglass` 函数输出沙漏图形,并在每个输出个空行。 ### 复杂度分析 - **时复杂度**:$O(n^2)$,其中 $n$ 是沙漏的总行数。因为需要嵌套循环来输出沙漏图形。 - **空复杂度**:$O(1)$,只使用了常数级的额外空
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值