牛客网刷题 | BC105 菱形图案

2024-06-01 21:04

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

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

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

感谢阅读!

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


 描述

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

输入描述:

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

输出描述:

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


思路 :

可以分成两个部分来看 上面是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 打印三个

//......


1. 理解菱形图案的结构

菱形图案由两部分组成:上半部分和下半部分。上半部分从中间的1个星号开始,每行递增一个星号,直到达到最宽行(星号数量等于输入的整数)。下半部分则从最宽行开始,每行递减一个星号,直到回到中间的1个星号。

2. 输入处理

程序需要读取用户输入的整数(2~20),这个整数代表菱形最宽行的星号数量。由于可能有多次输入,所以使用while循环结合scanf函数来持续读取输入,直到遇到文件结束符EOF。

3. 打印上半部分

  • 初始化行数变量i为0。
  • 使用for循环,从0开始递增,直到达到最宽行(i < n)。
  • 在每行开始,首先打印空格,空格数量为n - i - 1。这是因为菱形是中心对称的,需要在星号两侧留出相应的空格以保持图案居中。
  • 接着打印星号,星号数量为i + 1,使用内层for循环实现,每打印一个星号后跟一个空格。
  • 每行结束后打印换行符\n

4. 打印下半部分

  • 下半部分的打印逻辑与上半部分类似,但是行数递减,星号数量也随之递减。
  • 使用另一个for循环,从n - 1开始递减,直到1(i > 0)。
  • 同样首先打印空格,空格数量为i - 1
  • 然后打印星号,星号数量为n - i,使用内层for循环实现,每打印一个星号后跟一个空格。
  • 每行结束后打印换行符\n

代码 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;
}

 代码 2 :

#include <stdio.h>int main() {int n;// 处理多组输入直到EOFwhile (scanf("%d", &n) != EOF) {int i, j; // 定义循环变量i和j// 打印菱形的上半部分for (i = 0; i < n; i++) {// 打印空格for (j = 0; j < n - i - 1; j++) {printf(" ");}// 打印星号和空格for (j = 0; j <= i; j++) {printf("* ");}printf("\n"); // 换行}// 打印菱形的下半部分for (i = n - 1; i > 0; i--) {// 打印空格for (j = 0; j < i - 1; j++) {printf(" ");}// 打印星号和空格for (j = 0; j < n - i; j++) {printf("* ");}printf("\n"); // 换行}}return 0; // 程序结束
}

这段代码首先包含了stdio.h头文件,定义了主函数main

然后,程序使用while循环来读取输入直到EOF。

外层for循环首先控制打印菱形的上半部分,内层两个for循环分别用来打印空格和星号。接着,另一个外层for循环控制打印菱形的下半部分。

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

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

代码 3 :

#include <stdio.h> // 引入标准输入输出库函数int main() // 主函数开始
{int n = 0; // 定义一个整型变量n,用于存储用户输入的菱形最宽处的星号数量while(scanf("%d",&n) != EOF) // 使用while循环处理多组输入直到文件结束符EOF{// 打印菱形的上半部分,包括中间行for (int i = 0; i < n + 1; i++) // 循环从0到n,包括n,打印上半部分和中间行{// 打印前面的空格,使星号居中for (int j = 0; j < n - i; j++){printf(" ");}// 打印星号,星号数量从0开始递增,等于当前行号ifor (int j = 0; j <= i; j++){printf("* ");}printf("\n"); // 每行结束后换行}// 打印菱形的下半部分for (int i = 0; i < n; i++) // 循环从0开始到n-1,打印下半部分{// 打印前面的空格,使星号居中for(int j = 0; j <= i; j++){printf(" ");}// 打印星号,星号数量从n-1开始递减,等于n-i-1for (int j = 0; j < n - i - 1; j++) // 这里j的初始值应为0,因为星号数量从n-i-1开始{printf("* ");}printf("\n"); // 每行结束后换行}}return 0; // 主函数结束,返回0表示程序正常退出
}

  

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



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

相关文章

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

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的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

C++ 菱形继承与虚拟继承的详解与代码示例

在C++中,多重继承虽然强大,但也会带来不少问题。特别是当继承链中出现菱形继承时,容易导致基类的重复实例化。本文将深入讨论菱形继承的问题,并详细解释如何通过虚拟继承来解决它。同时,给出一个简单的代码示例,并逐步解析输出结果。 什么是菱形继承? 菱形继承是指在多重继承中,同一个基类被多个派生类继承,而这些派生类又被另一个类继承,最终形成菱形结构,如下图所示: A/ \B C\ /D

牛客《剑指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