牛客网刷题总结(各种图形篇)

1.线段图案到 箭形图案

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//线段图案
int main()
{   
    int num;
    int i;
    while(scanf("%d",&num) == 1)
    {
        for(i=0;i<num;i++)
        {
            printf("*");
        }
        printf("\n");
    }
     return 0;
}



打印正方形
int main()
{
    int num;
    int i;
    while (scanf("%d", &num) == 1)
    {
        int j;
        for (i = 0; i < num; i++)
        {
            for (j = 0; j < num; j++)
            {
                printf("* ");
            }
            if (i / num == 0)
                printf("\n");
        }
    }
    return 0;
}


直三角形                    沉下心来
int main()
{
	int n;//定义三角形的边长
	while (scanf("%d", &n) == 1)//实现多组输入
	{
		//*的个数和行数一样
		int i, j;
		for (i = 0; i < n ; i++)
		{
			for (j = 0; j < i+1; j++)
			{
				printf("* ");
			}
			printf("\n");
		}
	}
	return 0;
}
//反转三角形
int main()
{
	int n;//定义三角形的边长
	while (scanf("%d", &n) == 1)//实现多组输入
	{
		//*的个数和行数一样
		int i, j;
		for (i = n; i > 0; i--)
		{

			for (j = i; j > 0; j--)
			{
				printf("* ");
			}
			printf("\n");
		}
	}
	return 0;
}

//字符圣诞树
int main()
{
	int n;
	int i, j;
	int b;//空格
	//功能实现
	while (scanf("%d", &n) == 1)
	{
		for (i = 1; i < n + 1; i++)
		{
			//先输出空格
			for (b = 0; b <n-i; b++)
			{
			printf(" ");//本质上还是一个正方形,只不过用空格代替
						//第一行  n-1个空格,第二行n-2个空格,最后一行没有空格
			}
			//输出空格后,在打印*号
			for (j = 0; j < i; j++)
			{
				printf("* ");
			}
			printf("\n");
		}
	}
	return 0;
}

//三角形
int main()
{
	int n;
	int i, j;
	int b;//空格
	//功能实现
	while (scanf("%d", &n) == 1)
	{
		for (i = 1; i < n + 1; i++)
		{
			//先输出空格
			for (b = 0; b < n - i; b++)
			{
				printf("  ");//注意这里有两个空格,只有这样,才能把字符挤到最后面
				//本质上还是一个正方形,只不过用空格代替
				//第一行  n-1个空格,第二行n-2个空格,最后一行没有空格
			}
			//输出空格后,在打印*号
			for (j = 0; j < i; j++)
			{
				printf("* ");
			}
			printf("\n");
		}
	}
	return 0;
}


求字符串长度的三种方法  库函数  自定义   函数递归
int main()
{
	char arr[] = "abc";
	int len = strlen(arr);
	printf("%d", len);
	return 0;
}
int my_strlen(char* p)
{
	int count =0;
	while (*p != '\0')
	{
		count++;
		p++;
	}
	return count;
}
函数递归
求一个字符串长度是一件大事,要大事化小,获取第一个字符,只要不是\0就可以
获取一个,就取观察下一个
int my_strlen(char* p)
{
	if (*p == '\0')//p指向的是数组的首地址,那*p就是数组的第一个元素,若第一个元素为\0,则字符串长度为0
		return 0;
	else         //如果第一个元素不为\0,那么字符串长度至少为1,所以就砍掉了第一个字符,再去递归观察其余字符
		return 1 + my_strlen(p+1);//注意不要写成return 1 + my_strlen(p++);会先遇到p,再++
}
int main()
{
	char arr[] = "abc";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}
更通用一些
int main()
{
	printf("请输入字符串:");
	char arr[100];
	scanf("%s", arr);
	int len = my_strlen(arr);
	printf("字符串长度=%d\n", len);
	return 0;
}

#include <stdio.h>
//菱形
int main()
{
	int n;
	int i, j;
	int b;//空格
	//功能实现
	while (scanf("%d", &n) == 1)
	{
		for (i = 1; i < n + 2; i++)
		{
			//先输出空格
			for (b = 0; b < n - i + 1; b++)
			{
				printf(" ");//本质上还是一个正方形,只不过用空格代替
				//第一行  n-1个空格,第二行n-2个空格,最后一行没有空格
			}
			//输出空格后,在打印*号
			for (j = 0; j < i; j++)
			{
				printf("* ");
			}
			printf("\n");
		}
		for (i = n; i > 0; i--)
		{
			//先输出空格
			for (b = 0; b < n - i; b++)
			{
				printf(" ");//本质上还是一个正方形,只不过用空格代替
				//第一行  n-1个空格,第二行n-2个空格,最后一行没有空格
			}
			//输出空格后,在打印*号
			for (j = 0; j < i; j++)
			{
				printf(" *");
			}
			printf("\n");
		}
	}
	return 0;
}


int main()
{
	//k型图案
	//定义长度
	int n;
	scanf("%d", &n);
	//循环实现
	int i = 0;
	int j = 0;
	for (i = 0; i <n+1; i++)
	{
		for (j = 0; j < n + 1 - i; j++)
		{
			printf("* ");
		}
		printf("\n");
	}
	for (i = 1; i < n + 1; i++)
	{
		for (j = 0; j < i+1; j++)
		{
			printf("* ");
		}
		printf("\n");
	}
	return 0;
}

4.28收尾   箭图案
int main()
{
	int n;
	scanf("%d", &n);
	循环实现部分
	int i = 0;
	int j = 0;
	int b;//空格
	分为正序逆序两部分即可
	for (i = 0; i < n+1; i++)
	{
		for (b = 0; b < n-i; b++)//想不通时取个简单的数验证下
		{
			printf("  ");
		}
		for (j = 0; j < i + 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	逆序输出
	for (i = 1; i < n + 1; i++)
	{
		for (b = 0; b <i; b++)
		{
			printf("  ");
		}
		for (j = 0; j <n+1-i; j++)//数量由多变少(会随着i的增大而增大)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

 2.反斜线及其之后

//命运负责洗牌和发牌,而我们只能出牌。-叔本华
//4.29    lvzi
//反斜线
//int main()
//{
	//定义行数
	int n;
	while (scanf("%d", &n) == 1)
	{
		//实现过程
	int i;
	int b;
	for (i = 1; i < n+1; i++)//i从1开始容易想,把它当作行数
	{
		//先打印空格    
		for (b = 0; b < i - 1; b++)
			printf(" ");
		//每行只有一个*
		printf("*");
		printf("\n");
		}

	}
//	return 0;
//}

正斜线
int main()
{
	//定义行数
	int n;
	while (scanf("%d", &n) == 1)
	{
		//实现过程
		int i;
		int b;
		for (i = 1; i < n + 1; i++)
		{
			//先打印空格    
			for (b = 0; b <n-i ; b++)
				printf(" ");
			//每行只有一个*
			printf("*");
			printf("\n");
		}

	}
	return 0;
}

//x型图案
int main()
{
	//定义输入数字
	int n;
	while (scanf("%d", &n) == 1)
	{
	//看作正斜线和反斜线,从上往下打印
	int i, j;//定义行和列
	for (i = 1; i < n+1; i++)
	{
		for (j = 1; j < n+1 ; j++)
		{
			//有两种情况需要打印星号,正对角线和逆对角线
			if (i == j || i + j == n + 1)
				printf("*");
			else
				printf(" ");
		}
		printf("\n");
	}
	}
	return 0;

//空心正方形
int main()
{
	int n;
	while (scanf("%d", &n) == 1)
	{
		//第一行和最后一行=n,i=1&&i=n
		//其余只有两个  j=1&&j=n
		int i, j;//i是列数,j是行数
		//一行一行遍历
		for (i = 1; i < n + 1; i++)
		{
			if (1 == i || n == i)//第一行和最后一行需要输出的*的个数等于n
			{
				for (j = 0; j < n; j++)
					printf("* ");
				printf("\n");
			}
			else if (2 <= i && i <= n - 1)//除了第一行和最后一行之外,其余行形式一致,只有两个*,其余为空格
			{
				for (j = 1; j < n+1; j++)//注意输出的*后面还有一个空格,算上空格的长度,列数一共有n+n-1;
				{
					if (j == 1 ||j == n)
					{
						printf("* ");
					}
					else
						printf("  ");
				}
				printf("\n");
			}
		}
	}
	return 0;
}

另一个比较nb的写法   空心正方形
会发现,中间大量出现空格,其实也有规律,排除第一行,最后一行和第一列和最后一列,其余部分全是*,这之间的是空格
int main()
{
	int n;
	int i, j;
	while (scanf("%d", &n) == 1)
	{
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < n; j++)
			{
				if (0 < i&& n-1>i &&0<j && n-1>j)
					printf("  ");//注意这有两个空格,加一个空格不就好了吗
				else
					printf("* ");
			}
			printf("\n");

		}
	}
	return 0;
}

4.29收尾
极其难受的一天,鼻塞加感冒,要死的啦
空心三角形
int main()
{

	//和上题差不多吗,第一行一个,最后一行等于n
	//其余行只有两个
    int n;int i, j;
    while (scanf("%d", &n) == 1)
    {
        printf("*");//先输出前两行,格式相同
        printf("\n");
        printf("* *");
        printf("\n");
        for (i = 3; i < n; i++)//中间部分
         {
        for (j = 0; j < n; j++)
        {
            if (j == 0 || j == i-1)//只有在第一列和i-1列才会有*
                printf("* ");
            else
                printf("  ");//其余位置全是空格
        }
        printf("\n");
        }
        for (i = 0; i < n; i++)
        {
            printf("* ");//输出最后一行
        }
        printf("\n");//多组输入,记得在最后添加一个\n
        }
    return 0;
}

总结:图形的题目大多都是利用循环解题,题目不难,但很考察想象能力;

同样,不同的人写的代码复杂程度也会不一样(就比如那个空心正方形),要善于找到图形的特点,简化代码,提高效率;在学会一种方法后,要积极利用,不断锤炼自己的思维。

共勉!

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值