首页 > 试题广场 >

菱形图案

[编程题]菱形图案
  • 热度指数:27234 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的菱形图案。

输入描述:

多组输入,一个整数(2~20)。



输出描述:

针对每行输入,输出用“*”组成的菱形,每个“*”后面有一个空格。

示例1

输入

2

输出

  * 
 * * 
* * * 
 * * 
  * 
示例2

输入

3

输出

   * 
  * * 
 * * * 
* * * * 
 * * * 
  * * 
   * 
示例3

输入

4

输出

    * 
   * * 
  * * * 
 * * * * 
* * * * * 
 * * * * 
  * * * 
   * * 
    * 
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            List<String> remember = new ArrayList<>(n);
            for (int i = 1; i <=n+1; i++) {
                String str = String.join("",Collections.nCopies(n+1-i," "));
                str+=String.join("",Collections.nCopies(i,"* "));
                remember.add(str);
            }
            boolean flag = true;
            for (int i = 0; i >=0 ;) {
                if (i==remember.size()-1)flag=false;
                System.out.println(remember.get(i));
                i= flag?++i:--i;
            }
        }
    }
}

发表于 2020-04-22 10:27:51 回复(4)
#include<iostream>
using namespace std;

//分为上下两个金字塔
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n+1;i++)
        {//上
            for(int j=0;j<(n-i);j++)
                cout<<" ";
            for(int j=0;j<i+1;j++)
                cout<<"* ";
            cout<<endl;
        }
        for(int i=n;i>0;i--)
        {//下
            for(int j=0;j<(n-i+1);j++)
                cout<<" ";
            for(int j=0;j<i;j++)
                cout<<"* ";
            cout<<endl;
        }
    }
    return 0;
}

发表于 2020-07-25 00:47:31 回复(0)
#include<stdio.h>
int main()
{
    int n;
    while( scanf("%d",&n) != EOF )
    {
        for( int i = 0 ; i < ( n + 1 ) ; i++ )    //i=0,1,2
        {
            for( int j = i ; j < n ; j++ ) printf(" ");    //j=0~n,1~n,2~n
            for( int j = i ; j >= 0 ; j-- ) printf("* ");    //j=0,1~0,2~0
            printf("\n");
        }
        for( int i = 0 ; i < n ; i++ )    //i=0,
        {
            for( int j = i ; j >= 0 ; j-- ) printf(" ");    //j=0,
            for( int j = i ; j < n ; j++ ) printf("* ");    //j=0~n,
            printf("\n");
        } 
    }
    return 0;
}

发表于 2022-06-17 08:11:11 回复(0)
#include<stdio.h>
int main(void)
{
    int num,i,j;
    while(scanf("%d",&num)!=EOF)
    {
        for(i=0;i<num;i++)
        {
            for(j=num-1;j>=i;j--)//上面的三角形每行要多出一个空格
            {
                printf(" ");
            }
            for(j=0;j<=i;j++)
            {
                printf("* ");
            }
            printf("\n");
        }
        for(i=0;i<num+1;i++)
        {
            for(j=1;j<=i;j++)
            {
                printf(" ");
            }
            for(j=num+1;j>i;j--)
            {
                printf("* ");
            }
            printf("\n");
        }
    }
    return 0;
}

发表于 2022-01-29 16:48:56 回复(0)
while True:
    try:
        n = int(input())
        for i in range(1,n+2):
            s = "* "*(i)
            print(s.center(2*n+1))
        for i in range(0,n):
            s = "* "*(n-i)
            print(s.center(2*n+1))
    except EOFError:
        break
发表于 2022-01-27 22:54:32 回复(0)
while True:
    try:
        n = eval(input())
        l= [] # 输入 4 获取[1,2,3,4,5,4,3,2,1]

        for i in range(1,n +1): # [1, 2, 3, 4]
            l.append(i)
        list_2 = l[::-1] # 把[1,2,3,4]倒序赋值给list_2
        list_3 = l+[n+1]+list_2 #拼接为 [1,2,3,4]+[5]+[4,3,2,1]

        for i in list_3: # [123454321]
            print(' '*(n-i+1)+'* ' *i) # 这里要用+号,不能用,号。如果用逗号,要sep=''。
    except:
        break

发表于 2021-09-22 10:14:22 回复(0)
思路:找到规律后只需要一个循环+if判断来完成
while True:
    try:
        n = int(input())
        for i in range(1,2*n+2):
            if i <= n+1:
                print(" "*(n+1-i)+"* "*i)
            else:
                print(" "*(i-(n+1))+"* "*((n+1)-(i-(n+1))))
    except:
        break


编辑于 2021-03-16 16:11:09 回复(0)
#include <stdio.h>
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        int i,j;
        for(i=0;i<n;i++){
            for(j=0;j<n-i;j++){
                printf(" ");
            }
            for(j=0;j<i+1;j++){
                printf("* ");
            }
            printf("\n");
        }
        for(i=0;i<=n;i++){
            printf("* ");
        }
        printf("\n");
        for(i=n+1;i<2*n+1;i++){
            for(j=0;j<i-n;j++){
                printf(" ");
            }
            for(j=0;j<2*n+1-i;j++){
                printf("* ");
            }
            printf("\n");
        }
    }
}

发表于 2020-04-11 09:27:14 回复(0)
#include <cstdio>
int main()
{
    int a;
    while(~scanf("%d",&a))
    {
        for(int i=0;i<=a;++i)//a+1行 上半部分
        {
            for(int k=0;k<a-i;++k)//空格
                printf(" ");
            for(int j=0;j<=i;++j)//*与空格
                printf("* ");
            printf("\n");
        }
        for(int i=a;i>0;--i)//a行   下半部分
        {
            for(int k=0;k<=a-i;++k)
                printf(" ");
            for(int j=0;j<i;++j)
                printf("* ");
            printf("\n");
        }
    }
    return 0;
}

编辑于 2020-03-26 10:40:37 回复(0)
菱形输出分成上中下三个部分,所以我们采取不复杂且最简单的方式就是分三个部分输出,上面部分和下面部分是两个相同的三角形,而中间输出的星星数量恰好为n+1个,中间这个作为对称轴使其上下轴对称。中间则单独输出。
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    while(cin >> n){
        for(int i = 1; i <= n; i++){
            for(int j = 0; j <= n - i; j++)
                cout << " ";
            for(int k = 0; k < i; k++)
                cout << "* ";
            cout << endl;
        }
        for(int i = 1; i <= n + 1; i++)
            cout << "* ";
        cout << endl;
        for(int i = 1; i <= n; i++){
            for(int j = 0; j < i; j++)
                cout << " ";
            for(int k = 0; k <= n - i; k++)
                cout << "* ";
            cout << endl;
        }
    }
    return 0;
}

发表于 2020-06-01 14:44:40 回复(0)
#include <stdio.h>
#include<stdlib.h>
int main()
{
    int n,j;
    while(~scanf("%d",&n))
    {
        for(int i=-n;i<=n;i++)//当i==0时,此时循环到中间行(也就是无空格行)
        {
            int l=abs(i);
            for(j=l;j>0;j--)
                printf(" ");
            for(j=0;j<=n-l;j++)
                printf("* ");
            printf("\n");
        }
    }
    return 0;
}

发表于 2022-11-19 08:47:31 回复(1)
/*思路 : 可以分成两个部分来看 上面是n行 下面是n+1行
for(j=0;j<n-i;j++)
//如果这里要打印四个空格 4-0=4 三个空格4-1=3 两个空格4-2=2
for(j=0;j<=i;j++)
//因为这里j都是每次从0开始的 
//当i为0的时候打印零个 为1的时候打印一个 为2的时候打印两个
//......
//i随着变化而变化
 for(j=0;j<i;j++)
//打印空格
//当i为0的时候不打印 当i为1的时候打印一个空格
//当i为2的时候打印两个 ......
for(j=0;j<n+1-i;j++)
//这里是因为是n+1行 所以要写成n+1
//这里是5的时候 i为0 就打印五个
//为4的时候 i为1 打印四个
//为3的时候 i为2 打印三个
//......
*/
# include <stdio.h>
int main ()

{
    int n = 0;
    while(scanf("%d",&n)!=EOF)
    {
        int i = 0;
        for(i = 0; i<n; i++)
    {
         //上半部分
        int j = 0;
        //先打印空格
        for(j=0;j<n-i;j++)
        //如果这里要打印四个空格 4-0=4 三个空格4-1=3 两个空格4-2=2
        //......
        {
            printf(" ");
        }
        //接下来打印 空格+星号
        for(j=0;j<=i;j++)
        //因为这里j都是每次从0开始的 
        //当i为0的时候打印零个 为1的时候打印一个 为2的时候打印两个
        //......
        //i随着变化而变化
        {
            printf("* ");
        }
        printf("\n");
    }
        //下半部分
        //n+1 行
        //依旧是有空格加型号组成的
        for(i=0;i<n+1;i++)
        {
            int j = 0;
            for(j=0;j<i;j++)
            //打印空格
            //当i为0的时候不打印 当i为1的时候打印一个空格
            //当i为2的时候打印两个 ......
            {
                printf(" ");
            }
            for(j=0;j<n+1-i;j++)
            //这里是因为是n+1行 所以要写成n+1
            //这里是5的时候 i为0 就打印五个
            //为4的时候 i为1 打印四个
            //为3的时候 i为2 打印三个
            //......
            {
                printf("* ");
            }
            printf("\n");
        }
        
    }

    return 0;
}

发表于 2024-06-01 19:48:08 回复(0)
上下对称的图像,循环考虑 -n 至 n
while True:
    try:
        a = int(input())
        for i in range(-a,a+1):
            print(" "*abs(i)+"* "*(a+1-abs(i)))
    except:
        break



编辑于 2024-02-05 13:08:09 回复(0)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int n = 0;
    int a = 0;
    while (scanf("%d", &n) != -1)
    {
        for (a = 1; a <= n; a++)
        {
            int b = n - a + 1;
            while (b)
            {
                printf(" ");
                b--;
            }
            int c = a;
            while (c)
            {
                printf("* ");
                c--;
            }
            printf("\n");
        }
        for (int i = 0; i <= n; i++)
        {
            printf("* ");
        }
        printf("\n");
        for (a = n; a >= 0; a--)
        {
            int b = n - a + 1;
            while (b)
            {
                printf(" ");
                b--;
            }
            int c = a;
            while (c)
            {
                printf("* ");
                c--;
            }
            printf("\n");
        }
    }
    return 0;
}
发表于 2023-11-27 10:30:49 回复(0)
while True:
    try:
        n=int(input())
        for i in range(1,n+2):
            print(' '*(n+1-i)+'* '*i)
        for i in range(n,0,-1):
            print(' '*(n+1-i)+'* '*i)
    except:
        break   

发表于 2023-01-20 10:38:58 回复(0)
while True:
    try:
        n = int(input())
        
        for i in range(-n,n+1):
            print(' '*abs(i)+'* '*(n+1-abs(i)))
    except:
        break

发表于 2022-10-07 22:12:31 回复(1)
#include<stdio.h>
int main()
{
    int n=0;
    int i=0;
    int k=0;
    int j=0;
    int m=0;
    char ch1='*';
    char ch2=' ';
    while(~scanf("%d",&n))
    {
        for(i=1;i<=n;i++)
        {
            for(k=0;k<n+1-i;k++)
                printf("%c",ch2);
            for(j=0;j<i;j++)
                printf("%c ",ch1);
            printf("\n");
        }
        for(m=0;m<n+1;m++)
            printf("%c ",ch1);
        printf("\n");
        for(i=1;i<=n;i++)
        {
            for(k=1;k<=i;k++)
                printf("%c",ch2);
            for(j=n;j>=i;j--)
                printf("%c ",ch1);
            printf("\n");
        }
        
        
    }
    
    return 0;
}

发表于 2022-05-18 19:41:12 回复(0)
上下对称图形的通用解法
#include<bits/stdc++.h>
using namespace std;

int main() {
    int n;
    while(cin >> n) {
        n++;
        for(int i=1;i<=n*2-1;i++) {
            int spaceNum = abs(i-n);
            int starNum = n-spaceNum;
            for(int j=0;j<spaceNum;j++)
                cout << " ";
            for(int j=0;j<starNum;j++)
                cout << "* ";
            cout << endl;
        }
    }
    return 0;
}


发表于 2020-08-01 11:22:40 回复(0)
#include <stdio.h>
int main() {
    int n = 0;
    while (scanf("%d", &n) != EOF) {
        for (int i = 0; i < n + 1; i++) {
            for (int j = 0; j < n - i; j ++) {
                printf(" ");
            }
            for (int j = 0; j <=  i ; j++) {
                printf("* ");
            }
            printf("\n");
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                printf(" ");
            }
            for (int j = 0; j < n - i; j++) {
                printf("* ");
            }
            printf("\n");
        }
    }


    return 0;
}

发表于 2024-09-28 22:07:06 回复(0)
while True:
    try:
        n = int(input())
        for i in range(0,n):
            temp = "* " * (i) + "*"
            m = 2 * n - 1
            print(f"{temp:^{n*2+2}}")  #  ^居中,>居右,<居左对齐

        for i in range(n, -1, -1):
            temp = "* " * (i) + "*"
            m = 2 * n - 1
            print(f"{temp:^{n*2+2}}")  #  ^居中,>居右,<居左对齐
    except Exception as e:
        break

发表于 2024-09-28 19:01:53 回复(0)