首页 > 试题广场 >

箭形图案

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

输入描述:
本题多组输入,每行一个整数(2~20)。


输出描述:

针对每行输入,输出用“*”组成的箭形。

示例1

输入

2

输出

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

输入

3

输出

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

输入

4

输出

        *
      **
    ***
  ****
*****
  ****
    ***
      **
        *
#include<stdio.h>
int main()
{
    int n;
    while( scanf("%d",&n) != EOF )
    {
        for( int i = 0 ; i <= n ; i++)
        {
            for( int j = 2 * i ; j < 2 * n ; j++ ) printf(" ");
            for( int m = i ; m >= 0 ; m-- ) printf("*");
            printf("\n");
        }
        for( int i = 1 ; i <= n ; i++)
        {
            for( int j = 2 * i ; j > 0 ; j-- ) printf(" ");
            for( int m = i ; m <= n ; m++ ) printf("*");
            printf("\n");
        }
    }
    return 0;
}

发表于 2022-06-17 09:21:01 回复(0)
#include <iostream>
using namespace std;

int main()
{
    int n;
    while (scanf("%d", &n) != EOF)
    {
        //
        int cnt = 1;
        for (int i = 1; i <= n; i ++ )
        {
            for (int j = 1; j <= 2 * n + 1 - cnt; j ++ ) printf(" ");
            cnt += 2;
            for (int k = 1; k <= i; k ++ ) printf("*");
            printf("\n");
        }
        
        // 中间层
        for (int i = 1; i <= n + 1; i ++ ) printf("*");
        cnt -= 2;
        printf("\n");
        
//         //
        for (int i = n; i >= 1; i -- )
        {
            for (int j = 1; j <= 2 * n + 1 - cnt; j ++ ) printf(" ");
            cnt -= 2;
            for (int k = 1; k <= i; k ++ ) printf("*");
            printf("\n");
        }
    }
}

发表于 2022-02-28 20:22:04 回复(0)
#include<iostream>
using namespace std;
/*
分为上下两个部分找规律

上:
空格      *      空格
2(n-i)  i+1      i

下:
空格      *      空格
2(n-i+1)  i     i-1
*/
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n+1;i++)
        {//上半部分(上n+1行)
            for(int j=0;j<(2*(n-i));j++)
                cout<<" ";
            for(int j=0;j<i+1;j++)
                cout<<"*";
            for(int j=0;j<i;j++)
                cout<<" ";
            cout<<endl;
        }
        
        for(int i=n;i>0;i--)
        {//下半部分(下n行)
            for(int j=0;j<(2*(n-i+1));j++)
                cout<<" ";
            for(int j=0;j<i;j++)
                cout<<"*";
            for(int j=0;j<i-1;j++)
                cout<<" ";
            cout<<endl;
        }
    }
    return 0;
}

发表于 2020-07-25 00:06:49 回复(0)
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)*2," "));
                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 11:42:42 回复(0)
上下对称图形的通用解法
#include<bits/stdc++.h>
using namespace std;

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


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

编辑于 2024-01-09 19:15:49 回复(0)
#include <stdio.h>
int main()
{
    int z;
    while(scanf("%d", &z) != EOF){
        /*
        外层循环控制行 i,
        内层循环控制列。
        
        上半部分:
            z行
            先输出第一行6个,第二行4个,第三行2个  空格
                 2z       zz-2      2z-4
                 2z-2i+2  2z-2i+2   2z-2i+2
            在输出i个"*"
        中间部分z+1个*
        下半部分:
            z行
            先输出2i个 空格
            在输出z-i+1个 "*"
        */
        for(int i = 1; i <= z; i++){
            for(int j = 1; j <= 2*z-2*i+2; j++){
                printf(" ");
            }
            for(int k = 1; k <= i; k++){
                printf("*");
            }
            putchar(10);
        }
        for(int i = 1; i <= z+1; i++){
            printf("*");
        }
        putchar(10);
        for(int i = 1; i <= z; i++){
            for(int j = 1; j <= 2*i; j++){
                printf(" ");
            }
            for(int k = 1; k <= z-i+1; k++){
                printf("*");
            }
            putchar(10);
        }
    }
    return 0;
}

发表于 2020-05-28 22:33:54 回复(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 + 1; j++)   
                printf("*");

            printf("\n");
        }
        
        //打印下半
        for(int i = 0; i < n; i++)
        {    
            for(int j = 0; j < i + 1 ; j++)   
                printf("  ");
            for(int j = 0; j < n - i; j++)   
                printf("*");
            
            printf("\n");
        } 
    //此写法更加统一循环的书写风格,更易读懂吧吧吧     
    }
    return 0;
}

发表于 2024-06-20 18:12:15 回复(0)
#include <stdio.h>

int main()
{
	int input = 0;
	int i = 0;
	int j = 0;
	int tem = 0;

	//我们将箭型分为3个部分来看,分开实现
	// 上部 -- 有input行
	// 中部 -- 有1行
	// 下部 -- 有input行
	//
	while (scanf("%d", &input) == 1)
	{
		tem = 0;

		//上部
		for (i = 0; i < input; i++)
		{
			for (j = 0; j < input * 2 - tem; j++)//空格每行减少2位
			{
				printf(" ");
			}
			for (j = 0; j <= i; j++)//每行输出i个*号,但因为我们的i是从0开始数,所以使用<=i
			{
				printf("*");
			}
			tem += 2;
			printf("\n");
		}

		tem = 0;

		//下中部
		for (i = 0; i < input + 1; i++)
		{
			for (j = 0; j < tem; j++)//空格每行增加2位
			{
				printf(" ");
			}
			for (j = 0; j <= input - i ; j++)//*号每行减少1位,但因为i是从0开始,所以是<=i
			{
				printf("*");
			}
			tem += 2;
			printf("\n");
		}
	}
	return 0;
}

编辑于 2024-02-06 19:39:10 回复(0)
#include <stdio.h>
int main()
{
    int x,i,j;
    while (scanf("%d", &x) != EOF)
    {
        for (i = 0; i < x; i++)
        {
            for (j = 2 * (x - i+1) - 2; j >= 1; j--)
                printf(" ");
            for (j = 0; j <= i; j++)
                printf("*");
            printf("\n");
        }
        for (i = 0; i <= x; i++)
        {
            for (j = 0; j < 2 * i; j++)
                printf(" ");
            for (j = 1; j <= x + 1 - i; j++)
                printf("*");
            printf("\n");
        }
    }
    return 0;
}
发表于 2022-12-08 20:18:03 回复(0)
#include <stdio.h>
int main() {
    int n, i, j;
    while (scanf("%d", &n) != EOF) {
        n += 1;
        // 输出前3行
        for (i = 1; i <= n; i++) {
            for (j = 1; j <= n; j++) {
                if (j <= n - i)
                    printf("  ");
                else
                    printf("*");
            }
            printf("\n");
        }
        // 输出后2行
        for (i = n-1; i >= 1; i--) {
            for (j = 1; j <= n; j++) {
                if (j > n - i)
                    printf("*");
                else
                    printf("  ");
            }
            printf("\n");
        }
    }
    return 0;
}
发表于 2022-09-28 21:55:08 回复(0)
#include<iostream>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n+1;i++)
        {//上半部分(上n+1行)
            for(int j=0;j<(2*(n-i));j++)
                cout<<" ";
            for(int j=0;j<i+1;j++)
                cout<<"*";
         
            cout<<endl;
        }
        
        for(int i=n;i>0;i--)
        {//下半部分(下n行)
            for(int j=0;j<(2*(n-i+1));j++)
                cout<<" ";
            for(int j=0;j<i;j++)
                cout<<"*";
       
            cout<<endl;
        }
    }
    return 0;
}
今天这部分还真是被※号折磨裂开了,不过确实有意思。下面说一下终极理解,一看就会的那种。
1.遇到对称图形,要上下分,中间那个放上下部分都行。
2.根据上下部分,先根据行数写出外层循环,一般是n或者n+1.这个简单。
3.********最重要的部分,就是算出星号和空格与行数的关系式子,看不清空格的话可以用鼠标上去一个一个数,写出表达式,带入循环,就可以得出!
--------------------------------------------------------------------------------------------------最强通用解
发表于 2022-04-20 19:17:51 回复(0)
#include<stdio.h>
int main()
{
    int n,i,j;
    while(~scanf("%d",&n))
    {
        for(i=0;i<n+1;i++)
        {
            for(j=i;j<n;j++)
                printf("  ");
            for(j=0;j<=i;j++)
                printf("*");
            printf("\n");
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<=i;j++)
                printf("  ");
            for(j=i;j<n;j++)
                printf("*");
            printf("\n");
        }
    }
    return 0;
}

发表于 2021-10-31 10:48:36 回复(0)
#include <stdio.h>
int main() {
    int n = 0;
    while (scanf("%d", &n) != EOF) {
        // ----------------- 上半部分
        int kk = n * 2;
        for (int i = 0; i <= n; i++) {
            for (int a = kk; a != 0; a--) {
                printf(" ");
            }
            for (int b = 0; b <= i; b++) {
                printf("*");
            }
            printf("\n");
            kk -= 2;
            if (kk == 1) {
                kk--;
            }
        }
        // ----------------- 下半部分
        int zz = 2;
        int yy = n;
        for (int x = n; x != 0; x--) {
            for (int c = zz; c != 0; c--) {
                printf(" ");
            }
            for (int d = yy; d != 0; d--) {
                printf("*");
            }
            zz += 2;
            yy--;
            printf("\n");
        }
    }
    return 0;
}
发表于 2025-06-22 17:28:02 回复(0)
#include <iostream>
using namespace std;

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

发表于 2025-03-08 21:34:43 回复(0)
#include <stdio.h>

int main() {
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<=n;i++)
        {
            for(int x=0;x<2*n-2*i;x++)
            {
                printf(" ");
            }
            for(int x=0;x<=i;x++)
            {
                printf("*");
            }
            printf("\n");
        }
        for(int i=0;i<n;i++)
        {
            for(int x=0;x<2*i+2;x++)
            printf(" ");
            for(int x=0;x<n-i;x++)
            printf("*");
            printf("\n");
        }
    }
    return 0;
}
发表于 2025-02-26 22:28:19 回复(0)
while 1:
    try:
        a=int(input())
        for i in range(1,a+1):
            print(' '*2*(a+1-i)+"*"*i)
        for i in range(a+1,0,-1):
            print(" "*(a+1-i)*2+"*"*i)
    except:
        break

发表于 2025-02-26 09:31:04 回复(0)
#include <stdio.h>
void print_arrow(int n) {
    int i = 0, j = 0;
    for (i = 0; i <= n; i++) {
        for (j = 0; j < n - i; j++) {
            printf("  ");
        }
        for (j = 0; j <= i; j++) {
            printf("*");
        }
        printf("\n");
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j <= i; j++) {
            printf("  ");
        }
        for (j = 0; j < n - i; j++) {
            printf("*");
        }
        printf("\n");
    }
}

int main() {
    int n = 0;
    while (scanf("%d", &n) != EOF) {
        print_arrow(n);
    }
}
发表于 2025-01-09 06:32:50 回复(0)
while True:
    try:
        n = int(input())
        for i in range(0, n + 1):
            temp = "*" * (i) + "*"
            m = 2 * (n - i)
            temp = " " * m + temp
            print(f"{temp:<{n**2+2}}")  #  ^居中,>居右,<居左对齐
        for i in range(n-1, -1, -1):
            temp = "*" * (i) + "*"
            m = 2 * (n - i)
            temp = " " * m + temp
            print(f"{temp:<{n**2+2}}")  #  ^居中,>居右,<居左对齐

    except Exception as e:
        break


发表于 2024-09-28 19:19:17 回复(0)
#include<stdio.h>
int main()
{
    int n, i, j,k;
    while ((scanf("%d", &n) != EOF))
    {
        k = 0;
        for (i = 0; i < 2 * (n+1); i = i + 2)
        {
            for (int j = i; j < (2 * n); j++) printf(" ");
            for (int m = i; m >= k; m--)  printf("*");            
            k++;
            printf("\n");
        }
        k =n+2;
        for (i = 2; i < 2 * (n + 1); i = i + 2)
        {
            for (int j = i; j >0; j--) printf(" ");
            for (int m = i; m< k; m++)   printf("*");
            
            k++;
            printf("\n");
        }
    }
    return 0;
}

发表于 2024-08-26 21:08:38 回复(0)