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

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

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

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

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

共勉!

目录
相关文章
|
7月前
|
JavaScript 前端开发 C语言
leetcode每日一题 2021/4/2 面试题 17.21. 直方图的水量
leetcode每日一题 2021/4/2 面试题 17.21. 直方图的水量
25 0
|
22天前
|
JavaScript 前端开发 C语言
leetcode每日一题 2021/4/2 面试题 17.21. 直方图的水量
leetcode每日一题 2021/4/2 面试题 17.21. 直方图的水量
26 0
|
22天前
|
算法
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
24 3
|
22天前
|
存储 编译器 C语言
牛客网刷题笔记小节(二)
牛客网刷题笔记小节(二)
|
12月前
|
机器学习/深度学习 存储 算法
代码随想录训练营day30| 332.重新安排行程 51. N皇后 37. 解数独
代码随想录训练营day30| 332.重新安排行程 51. N皇后 37. 解数独
|
12月前
|
存储 索引
牛客网刷题笔记
牛客网刷题笔记
34 0
|
数据挖掘 Java 索引
【Nowcoder牛客刷题记录】——Python数据分析(一)
【Nowcoder牛客刷题记录】——Python数据分析(一)
671 1
|
数据采集 JSON 数据挖掘
【Nowcoder牛客刷题记录】——Python数据分析(二)
【Nowcoder牛客刷题记录】——Python数据分析
366 0
|
机器学习/深度学习 人工智能 C++
C/C++之(三)洛谷刷题基础 上
C/C++之(三)洛谷刷题基础 上
204 0
C/C++之(三)洛谷刷题基础 上
|
C++
C/C++之(二)洛谷刷题基础 中
C/C++之(二)洛谷刷题基础 中
216 0