从12月开始,阿崽就没更新啦,阿崽刷了一波题
接下来的一段时间,准备更新我的刷题的文,有的题有不同思路,欢迎各位宝子和我一起交流
牛客网-----循环输出图形
- BC98 线段图案
- BC99 正方形图案
- BC100 直角三角形图案
- BC101 翻转直角三角形图案
- BC102 带空格直角三角形图案
- BC103 金字塔图案
- BC104 翻转金字塔图案
- BC105 菱形图案
- BC106 K形图案
- BC107 箭形图案
- BC108 反斜线形图案
- BC109 正斜线形图案
- BC110 X形图案
- BC111 空心正方形图案
- BC112 空心三角形图案
- BC113 数字三角形
分析:1.多组输入应该使用循环(即while(scanf("%d",x)!=EOF)2.输入的数字和*相对应
代码实现
#include
int main() {
int a;
while (scanf("%d", &a) != EOF) {
for (int i = 0; i < a; i++) {
printf("*");
}
printf("\n");
}
return 0;
}
分析:1.和BC98一样需要我们循环输入,还是使用while(scanf("%d",x)!=EOF);
2.该图像涉及行和列,所以二重循环可以解决,变量i控制行的变化,变量j控制列的变化,由于每一行结束要换行,所以我们在列的值达到我们输入的值后,输入printf("\n");
代码实现
#include
int main()
{
int x;
while (scanf("%d", &x)!=EOF) //连续输入
{
for (int i = 1; i <= x; i++) //控制行数
{
for (int j = 1; j <= x; j++) //控制列数
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
分析:
1.和BC99一样都涉及到行和列的变化,所以仍是使用双重循环,变量i控制行,变量j控制列。2.当i==1是只有一列,i==2时有两列,所以for循环中控制语句有j<=i,列数的变化要小于行的变化
#include
int main() {
int a;
while (scanf("%d", &a) != EOF) {
for(int i=1;i<=a;i++){
for(int j=1;j<=i;j++){
printf("* ");
}
printf("\n");
}
}
return 0;
}
思路一:从行的角度
分析:1.和BC99一样涉及到行和列的变化,仍是使用双重循环
2.换一种思路:我们把第一行看做是第五行,也就是第五行有五列,第一行有一列,所以i从输入的值开始减到1,而列j仍然是从1开始,只要j小于等于i就行,比如i==5,j从1到5;i==4,j从1到4;
代码实现
#include
int main() {
int a;
scanf_s("%d", &a);
for (int i = a; i > 0; i--) {
for (int j = 1; j <= i; j++) {
printf("* ");
}
printf("\n");
}
return 0;
}
思路二:从列的角度
分析:1.和BC99一样涉及到行和列的变化,仍是使用双重循环
2.与BC100不一样的:第一行的时候有5列,最后一行只有一列,所以j的一层for循环只需从(输入的值)变到1即可,并且j的值要>=i的值,而i还是从1开始到输入的值
代码实现
#include
int main() {
int a;
while (scanf("%d", &a) != EOF) {
for(int i=1;i<=a;i++){
for(int j=a;j>=i;j--){
printf("* ");
}
printf("\n");
}
}
return 0;
}
分析:仍是使用双重循环(以四行四列为例)
当i==1时 前三列是空格,第四列是*
当i==2时,前两列是空格,第三列往后是*
当i==3时,前一列是空格,第二列往后是*
。。。
所以是一个三角(全是空格),一个三角(带*)
于是一个for循环用来打印空格三角,另外一个打印带*
第一列有三个空格(输入的值是4,所以空格变化范围是从1到4-1)后面的*就是从1开始,小于等于输入的值即可
#include
int main() {
int a;
while (scanf("%d", &a) != EOF) {
for (int i = 1; i <= a; i++) {
for (int j = a - 1; j >= i; j--) {
printf(" ");
}
for (int h = 1; h <= i; h++) {
printf("* ");
}
printf("\n");
}
}
return 0;
}
分析:以输入4为例
当你把这两个完全不同的图案放到一起的时候,可能还有点错觉,只需要第二个图的代码在输出*后面加个空格就是第一个图
代码实现:
#include
int main() {
int a;
while(scanf("%d",&a)!=EOF){
for (int i = 1; i <= a; i++) {
for (int j = a; j > i; j--) {
printf(" ");
}
for(int h=1;h<=i;h++){
printf("* ");
}
printf("\n");
}
}
return 0;
}
分析:只需要第二个图中*后面加个空格即可
思路一:从行出发
i==1,j==5;空格:0个
i==2,j==4;空格:1个
i==3,j==3;空格:2个
i==4;j==2;空格:3个
i==5,j==1;空格:4个
代码实现
#include
int main() {
int a;
scanf("%d", &a);
for (int i = 1; i <= a; i++) {
for (int h = 1; h <= i-1; h++) {
printf(" ");
}
for (int j = a; j >=i; j--) {
printf("* ");
}
printf("\n");
}
}
思路二:从列出发
分析:把第一行看成第五行
即i==5;j==5;空格数为0
i.....
i==1;j==5;空格数为4
代码实现:
#include
int main() {
int a;
while (scanf("%d", &a) != EOF) {
for (int i = a; i >0; i--) {
for (int j = a - 1; j >=i; j--) {
printf(" ");
}
for (int h = 1; h <= i; h++) {
printf("* ");
}
printf("\n");
}
}
return 0;
}
分析:图形由两部分组成:上半部分是金字塔图案,下半部分是翻转金字塔图案
即就是BC103和BC104的结合,唯独有一点不同就是下半部分要比输入的值少一层
代码实现
#include
int main() {
int a;
while (scanf("%d", &a) != EOF) {
for (int i = 1; i <= a+1; i++) {
for (int j = a+1; j > i; j--) {
printf(" ");
}
for (int h = 1; h <= i; h++) {
printf("* ");
}
printf("\n");
}
for (int i = 1; i <= a; i++) {
for (int j = 1; j <=i; j++) {
printf(" ");
}
for (int h = a; h >= i; h--) {
printf("* ");
}
printf("\n");
}
}
return 0;
}
同理,这里的代码也可以用上面提到的两种思路来实现
分析:该图形由两部分组成,一个是直角三角形图案另外一个是翻转直角三角形,但是:上半部分要比输入的值多一层,下半部分没有第一层;
代码实现
#include
int main() {
int a;
while(scanf("%d", &a)!=EOF){
for (int i = a + 1; i >= 1; i--) {
for (int j = 1; j <= i; j++) {
printf("* ");
}
printf("\n");
}
for (int i = 2; i <= a + 1; i++) {
for (int j = 1; j <= i; j++) {
printf("* ");
}
printf("\n");
}}
return 0;
}
当然也可以使用我们上面说的行和列两种不同的思路来实现
分析:当我们把这个图案加一个空格后就变成了
这样我们就有了这个题的思路了
将图案分成两部分,一个是我们旋转我们的直角三角形图案
另外一个是我们旋转我们的翻转直角三角形图案
代码实现
#include
int main()
{
int num;
int i,j,k;
while(scanf("%d",&num)!=EOF)
//将火箭图案从中间分开 上部分一个大循环 下部分一个循环
{
for(i=0;i<=num;i++)//上部分循环从此开始 此处确定了上部分循环的行数
{
for(j=0;j
分析:
以4行4列为例:我们发现*所在的行和列都相等;
由此得出本题
代码实现:
#include
int main() {
int a;
while(scanf("%d", &a)!=EOF){
for (int i = 1; i <= a; i++) {
for (int j = 1; j <=i; j++) {
if (i == j) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
分析:
由图得出:带*的行和列加起来都是4(输入的值)+1
代码实现
#include
int main()
{
int ch = 0;
while(scanf("%d", &ch)!=EOF){
for (int i = 1; i <= ch; i++) {
for (int j = 1; j <=ch; j++) {
if (i + j == ch+1) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
该图由反斜线形和正斜线形图案构成
条件为行数等于列数,或者行数加列数=输入数+1;
代码实现
#include
int main() {
int a;
while (scanf("%d", &a) != EOF) {
for(int i=1;i<=a;i++){
for(int j=a;j>=1;j--){
if((i+j==a+1)||(i==j)){
printf("*");
}else{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
分析:
以4*4为例 ,先看第一行和最后一行是全输出,中间两行第一列和最后一列需要输出 *,由此得出代码
代码实现
#include
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
for(int i=0; i
分析
以4*4为例,先看前三行:第一列是全打印,后面两列 *所在位置的行和列是相等的,然后再看第四行是全输出,由此得出代码
#include
int main() {
int a;
while (scanf("%d", &a) != EOF) {
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= a; j++) {
if (j == 1 || i == j) {
printf("* ");
}
else if (i == a) {
printf("* ");
}
else {
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
分析:以4*4为例
i==1,j==1,数字:1
i==2,j==2,数字:1,2
。。。。
所以类似于九九乘法表,列数小于等于行数
然后打印列数即可
代码实现
#include
int main() {
int a;
scanf_s("%d", &a);
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= i; j++) {
printf("%d ", j);
}
printf("\n");
}
}
今天阿崽就写到这吧,以上几道题都是找规律的题,善于画图和观察就能解出来,方法还有很多,大家可以思考。剩余了一个圣诞树,我们下期再更。