牛客网刷题 | BC103 金字塔图案

2024-06-01 21:28

本文主要是介绍牛客网刷题 | BC103 金字塔图案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目前主要分为三个专栏,后续还会添加:

        专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的金字塔图案。

输入描述:

多组输入,一个整数(2~20),表示金字塔边的长度,即“*”的数量,,也表示输出行数。

输出描述:

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


思路 :

首先可以想到这个由普通的直角三角形进行添加空格的操作

然后变成金字塔的形状 也是先打印空格 然后再打印星号加空格

*

**

***

****

*****

.......

由上面的直角三角形变形而来

先在星号后面加空格

然后在空格和星号前面加空格

 


  1. 理解问题:首先,要清楚题目要求打印一个等腰三角形图案,该三角形由星号(*)组成,且星号后面跟着一个空格。

  2. 确定输入:题目要求输入一个整数(2~20),这个整数表示金字塔一边的星号数量,同时也决定了打印的行数。

  3. 确定输出格式:每行的星号数量从1开始递增,直到达到最底层的n个星号。每行星号之间用空格分隔,星号后面也要跟一个空格。空格的数量需要根据当前行的位置来确定,以保证星号居中对齐。

  4. 设计算法

    • 使用一个外部循环(for循环)来控制行数,循环变量i从1遍历到n。
    • 对于每一行,首先需要打印一定数量的空格,使得星号能够居中。空格的数量可以通过(n - i) * 2来计算,因为除了最中间的星号外,每增加一行,两边都会多出一个空格。
    • 接着,使用一个内部循环(另一个for循环)来打印星号。每行的星号数量为2 * i - 1,这是因为除了第一行和最后一行外,其他每行的星号数量都是奇数,并且随着行数的增加,星号数量线性增加。
    • 每行打印完成后,使用printf("\n")输出一个换行符,以便开始打印下一行。
  5. 编写代码:根据上述算法设计,编写C语言代码实现功能。

  6. 处理多组输入:题目中提到有多组输入,因此使用while循环结合scanf函数来持续读取输入,直到EOF(文件结束符)。


代码 1 :

/*思路 : 首先可以想到这个由普通的直角三角形进行添加空格的操作
然后变成金字塔的形状 也是先打印空格 然后再打印星号加空格
*
**
***
****
*****
.......
由上面的直角三角形变形而来 
先在星号后面加空格
然后在空格和星号前面加空格
*/# 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=n-1;j>i;j--)//控制每行的空格 尤其要注意 j=n-1 //不能写成 j=n{printf(" ");}for(j=0;j<=i;j++)//这是打印星号和空格的循环{printf("* ");}printf("\n");}}return 0;
}-------------------------------------------------------------------
#include <stdio.h> // 包含标准输入输出库int main() // 主函数的开始
{int n = 0; // 定义一个整型变量n,用于存储用户输入的金字塔一边的长度// 使用while循环来处理多组输入直到文件结束符EOFwhile(scanf("%d",&n)!=EOF){int i = 0; // 定义一个整型变量i,用于控制外层循环,表示当前的行数// 外层循环,控制打印金字塔的每一行for(i = 0; i < n; i++) // 从第0行开始,直到第n-1行{int j = 0; // 定义一个整型变量j,用于控制内层循环// 内层第一个for循环,控制每行前面的空格数量// 空格的数量从最后一行的0个空格递增到第0行的n-1个空格for(j = n - 1; j > i; j--) // 从n-1开始递减到i,打印空格{printf(" "); // 打印一个空格}// 内层第二个for循环,控制每行打印星号和空格// 星号的数量随着行数的递增而递增,从第0行的1个星号到第n-1行的n个星号for(j = 0; j <= i; j++) // 从0开始递增,打印i+1个星号和空格{printf("* "); // 打印一个星号和一个空格}printf("\n"); // 每行结束后打印换行符,以便开始新一行的打印}}return 0; // 主函数结束,返回0表示程序正常结束
}

程序使用while循环来处理多组输入,直到遇到EOF。在每次循环中,首先读取用户输入的整数n,这个整数表示金字塔一边的长度。

外层for循环控制打印金字塔的行数,从第0行开始直到第n-1行。

对于每一行,首先是内层第一个for循环,用于打印空格,空格的数量从最后一行的0个递增到第0行的n-1个。

接着是内层第二个for循环,用于打印星号和空格,星号的数量从第0行的1个递增到第n-1行的n个。

每完成一行的打印后,使用printf("\n")来换行,准备打印下一行。当所有行都打印完毕后,while循环结束,程序返回0,表示正常退出。

代码 2 :

#include <stdio.h>int main() {int n;// 使用while循环处理多组输入直到EOFwhile (scanf("%d", &n) != EOF) {// 外层循环控制打印的行数for (int i = 1; i <= n; i++) {// 打印空格,使星号居中for (int j = 0; j < (n - i) * 2; j++) {printf(" ");}// 打印星号,每行的星号数量为2*i - 1for (int k = 1; k <= 2 * i - 1; k++) {printf("* ");}// 每行结束后换行printf("\n");}}return 0; // 程序结束
}

代码 3 :

//对于有行有列的图形采用双循环,i控制行,j控制列
//对于这种金字塔,倒三角,我们可以先利用循环把空格打印出来,然后在相应的位置放上*.
#include<stdio.h>
int main()
{int i,j,n;while (scanf("%d", &n) != EOF) {for (int i = 0; i < n; i++) {  //行for (int j = 0; j <n - i-1; j++) {//列,观察列与行的关系printf(" ");}for (int j = 0; j<= i; j++) {printf("* ");}printf("\n");}}
}-----------------------------------------------------------------------------#include <stdio.h> // 引入标准输入输出库函数int main() // 主函数开始
{int i, j, n; // 定义三个整型变量i, j, n,分别用于控制行数,列数和读取用户输入的金字塔边长// 使用while循环处理多组输入直到文件结束符EOFwhile (scanf("%d", &n) != EOF){// 外层循环,控制金字塔的行数,从0到n-1for (int i = 0; i < n; i++){// 内层第一个循环,控制每行前面的空格数量// 空格的数量为n - i - 1,随着行数增加,前面的空格减少for (int j = 0; j < n - i - 1; j++) // 列循环,打印空格{printf(" "); // 打印一个空格}// 内层第二个循环,控制每行打印星号的数量// 星号的数量为i + 1,随着行数增加,星号数量增加for (int j = 0; j <= i; j++) // 列循环,打印星号和空格{printf("* "); // 打印一个星号和一个空格}printf("\n"); // 每行结束后打印换行符,以便开始新一行的打印}}return 0; // 主函数结束,返回0表示程序正常退出
}

程序使用while循环来处理多组输入,直到遇到EOF。在每次循环中,首先读取用户输入的整数n,这个整数表示金字塔一边的长度。

外层for循环控制打印金字塔的行数,从第0行开始直到第n-1行。对于每一行,首先是内层第一个for循环,用于打印空格,空格的数量为n - i - 1

接着是内层第二个for循环,用于打印星号和空格,星号的数量为i + 1

每完成一行的打印后,使用printf("\n")来换行,准备打印下一行。

当所有行都打印完毕后,while循环结束,程序返回0,表示正常退出。

  

这篇关于牛客网刷题 | BC103 金字塔图案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022156

相关文章

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

牛客小白月赛100(A,B,C,D,E,F三元环计数)

比赛链接 官方讲解 这场比较简单,ABC都很签到,D是个不太裸需要预处理的 B F S BFS BFS 搜索,E是调和级数暴力枚举,F是三元环计数。三元环考的比较少,没见过可能会偏难。 A ACM中的A题 思路: 就是枚举每个边变成原来的两倍,然后看看两短边之和是否大于第三边即可。 不能只给最短边乘 2 2 2,比如 1 4 8 这组数据,也不能只给第二短边乘 2 2 2,比

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in

牛客《剑指Offer》 -- 数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路 特别注意负数的情况,出现负数,将其转化为正数然后求倒数。 class Solution {public:double Power(double base, int exponent) {double total = 1;bool flag = false

牛客网《剑指Offer》 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路 负数用补码,其实就是求一个数据在计算机中是存储是怎么样子的。用位运算,就能很好实现。 class Solution {public:int NumberOf1(int n) {int count = 0;int flag = 1;while (flag != 0) {if ((n & f

牛客网《剑指Offer》 矩形覆盖

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution {public:int rectCover(int number) {if(number==0) return 0;if(number==1) return 1;if(number==2) return 2;retu

牛客《剑指Offer》 变态跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 思路 根据 普通的跳台阶可以总结出 f(n) = f(n-1) + f(n-2) +f(n-3) + 。。。。+ f(1) +1 不妨设 f(0) = 1 , 则易得 class Solution {public:int jumpFloorII(int n

牛客《剑指Offer》 跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 思路 递归思想,n阶梯子走法等于n-1 加上n-2的。 class Solution {public:int jumpFloor(int number) {if(number==1) return 1;if(number==2) return 2;return jumpFl