130道基础OJ编程题之: 58 ~ 67 道

130道基础OJ编程题之: 58 ~ 67 道


OJ技巧

#include <stdio.h>

int main() {
    int a, b;
    while (scanf("%d %d", &a, &b) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        printf("%d\n", a + b);
    }
    return 0;
}
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            int b = in.nextInt();
            System.out.println(a + b);
        }
    }
}

0. 昔日OJ编程题:

130道基础OJ编程题之: 1~7道_ChinaRainbowSea的博客-CSDN博客

130道基础OJ编程题之: 8~19 道_ChinaRainbowSea的博客-CSDN博客

130道基础OJ编程题之: 20~28_ChinaRainbowSea的博客-CSDN博客_

130道基础OJ编程题之: 29 ~ 38 道_ChinaRainbowSea的博客-CSDN博客

130道基础OJ编程题之: 39 ~ 46 道_ChinaRainbowSea的博客-CSDN博客_oj编程题

130道基础OJ编程题之: 47 ~ 57 道_ChinaRainbowSea的博客-CSDN博客


58. BC61 金字塔图案

金字塔图案_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现:

思路: 两个 for 循环,找规律,分开打印,先处理空格,再处理星号,注意一点:针对每行输入,输出用“*”组成的金字塔,每个“*”后面有一个空格。

#include<stdio.h>

int main() {
    int n = 0;

    while (~scanf("%d", &n)) {
        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");

        }
    }


    return 0;
}

Java实现

思路: 和C语言实现的思路是一样的

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNextInt()) {
            int n = scanner.nextInt();

            for(int i = 0; i < n; i ++) {
                // 打印空格
                for(int j = 0; j < n-i-1;j++) {
                    System.out.print(" ");
                }

                // 处理星号
                for(int j = 0; j <= i; j ++) {
                    System.out.print("* ");
                }
                System.out.println();
            }
        }
    }
}


59. BC62 翻转金字塔图案

翻转金字塔图案_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现:

思路: 两个 for 循环行,列,找规律,先处理空格,再处理星号。注意一点: 针对每行输入,输出用“*”组成的金字塔,每个“*”后面有一个空格。

#include<stdio.h>

int main()
{
    int n = 0;
    while(scanf("%d",&n) != EOF) 
    {
        for(int i = 0; i < n; i ++) 
        {
            // 处理空格
            for(int j = 0; j < i; j++) 
            {
                printf(" ");
            }

            // 处理星号
            for(int j = 0; j < n-i;j++)
            {
                printf("* ");  // 注意空格
            }
            printf("\n");
        }
    }
    return 0;
}

java 实现

思路: 和C语言的实现一样,多组输入

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNextInt()) {
            int n = scanner.nextInt();

            for (int i = 0; i < n; i ++) {
                // 处理空格
                for (int j = 0; j < i; j++) {
                    System.out.print(" ");
                }

                // 处理星号
                for (int j = 0; j < n - i; j++) {
                    System.out.print("* ");  // 注意加空格
                }
                System.out.println();
            }
        }
    }
}


60. BC63 菱形图案

菱形图案_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现

思路: 多组输入,先分为上下两半部分处理,找规律,处理上半部分:先处理空格,再处理星号,注意星号后面附加上空格,

处理完上半部分,处理下半部分,注意下半部分比上部分多了一行,所以附加上 +1,再同样和上半部分一一样处理。

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

#include <stdio.h>

int main()
{
    int n = 0;
    while(~scanf("%d",&n)) 
    {
        // 处理上半部分
        for(int i = 0; i < n; i++)
        {
            // 上半部分:处理空格
            for(int j = 0; j < n-i; j++)
            {
                printf(" ");
            }
            // 上半部分: 处理星号
            for(int j = 0; j <= i; j++)
            {
                printf("* "); // 注意空格
            }
            printf("\n");
        }

        // 下半部分:
        for(int i = 0; i < n+1; i++)
        {
            // 处理空格
            for(int j = 0; j < i; j++)
            {
                printf(" ");
            }

            // 处理星号
            for(int j = 0; j < n + 1-i; j++)
            {
                printf("* "); // 注意空格
            }
            printf("\n");
        }
    }

    return 0;
}

java 实现

思路: 思路和C语言实现的思路是一样的

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNextInt()) {
            int n = scanner.nextInt();

            // 上半部分:
            for (int i = 0; i < n; i++) {
                // 上半部分: 空格处理
                for (int j = 0; j < n - i; j ++) {
                    System.out.print(" ");
                }

                // 上半部分: 星号处理
                for (int j = 0; j <= i; j++) {
                    System.out.print("* "); // 注意附加空格
                }
                System.out.println();
            }

            // 下半部分处理比上半部分多了 一个 1
            for (int i = 0; i < n + 1; i++) {
                // 空格处理
                for (int j = 0; j < i; j++) {
                    System.out.print(" ");
                }

                // 星号处理
                for (int j = 0; j < n + 1 - i; j++) {
                    System.out.print("* "); // 注意附加空格
                }
                System.out.println();
            }

        }
    }
}


61. BC64 K形图案

K形图案_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现

思路: 多组数据的输入,找规律:将打印的信息分为上下部分处理,上部分处理,星号的打印显示,下部分比上部分多了一行的数据显示,所以 附加 +1,注意的是:针对每行输入,输出用“*”组成的K形,每个“*”后面有一个空格。

#include<stdio.h>

int main()
{
    int n = 0;

    while(scanf("%d",&n) != EOF) 
    {
        // 上半部分:处理
        for(int i = 0; i < n; i++) 
        {
            // 星号处理
            for(int j = 0; j < n+1-i;j++) {
                printf("* ");  // 注意附加上空格
            }
            printf("\n");

        }

        // 下半部分处理,比上部分多 一个 +1
        for(int i = 0; i < n +1; i++) 
        {
            // 处理星号
            for(int j = 0; j <= i; j++)
            {
                printf("* "); // 注意附加上空格
            }
            printf("\n");
        }
    }

    return 0;
}

java实现

思路 : 和C语言实现的方式是一样的

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNextInt()) {
            int n = scanner.nextInt();

            // 处理上部分:
            for(int i = 0; i < n; i++) {
                // 处理星号
                for(int j = 0; j <= n - i; j++) {
                    System.out.print("* "); // 注意附加空格
                }
                System.out.println();
            }

            // 处理下半部分: 比上半部分多了一个 +1
            for(int i = 0; i < n + 1; i++) {
                // 处理星号
                for(int j = 0; j <= i; j++) {
                    System.out.print("* "); // 注意附加空格
                }
                System.out.println();
            }
        }
    }
}


62. BC65 箭形图案

箭形图案_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现:

思路: 多组数据的输入,找规律,将显示分为两部分处理,上下部分,上部分:先将空格打印显示处理(注意这里的空格是以 “两个空格为一组的”),再打印星号,上半部分处理完,就处理打印显示下部分,下部分比上部分多一行所以 +1,剩下的处理和上部分一样。

#include<stdio.h>

int main()
{
    int n = 0;
    
    while(~scanf("%d",&n)) 
    {
        // 上半部分处理:
        for(int i = 0; i < n; i++)
        {
            // 处理空格: 注意是两个空格为一组
            for(int j = 0; j < n - i; j++)
            {
                printf("  ");
            }

            // 处理星号
            for(int j = 0; j <= i; j++)
            {
                printf("*");  // 注意没有附加空格
            }
            printf("\n");
        }

        // 处理下半部分,比上部分多了一个 +1
        for(int i = 0; i < n +1 ; i++)
        {
            // 处理空格:同样两个空格为一组
            for(int j = 0; j < i; j++) 
            {
                printf("  ");
            }

            // 处理星号
            for(int j = 0; j < n+1-i; j++) 
            {
                printf("*"); // 注意没有附加空格
            }
            printf("\n");
        }
    }

    return 0;
}

java 实现

思路: 和C语言实现的是一样的

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNextInt()) {
            int n = scanner.nextInt();

            // 上半部分:处理
            for (int i = 0; i < n; i++) {
                // 空格处理: 两个空格为一组
                for (int j  = 0; j < n - i; j++) {
                    System.out.print("  ");  // 空格两个为一组
                }

                // 星号处理
                for (int j = 0; j <= i; j++) {
                    System.out.print("*");
                }
                System.out.println();
            }

            // 下部分:比上部分多了一行
            for (int i = 0; i < n + 1; i++) {
                // 空格处理: 两个空格为一组
                for (int j = 0; j < i; j++) {
                    System.out.print("  ");
                }

                // 星号处理
                for (int j = 0; j < n + 1 - i; j++) {
                    System.out.print("*");
                }
                System.out.println();
            }
        }
    }
}


63. BC66 反斜线形图案

反斜线形图案_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现

方式一:

思路: 多组输入,找规律:先处理空格,再处理打印的星号。

#include<stdio.h>

int main()
{
    int n = 0;
    
    while(~scanf("%d",&n)) 
    {
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < i; j++)
            {
                printf(" "); 
            }
            printf("*\n");   
        }
    }

    return 0;
}

方式二:

思路: 我们仔细观察可以发现,我们可以将所打印显示的图案,看成是一个数组,其中打印星号的位置就是,就是 行号 == 列号的位置。

在这里插入图片描述

#include <stdio.h>

int main()
{
    int n = 0;
    
    while(scanf("%d",&n) != EOF)
    {
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
            {
                if( i == j )
                {
                    printf("*");
                }
                else 
                {
                    printf(" ");
                }
            }
            printf("\n");
        }
    }

    return 0;
}

java实现

方式一

思路: 和C语言实现方式一的是一样的

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNextLine()) {
            String str = scanner.nextLine();

            // 将字符串转换 基本数据类型
            int n = Integer.parseInt(
                        str); // 注意已经是字符串了就不要加“双引号”了
            for (int i = 0; i < n; i++) {
                //打印空格
                for (int j = 0; j < i; j++) {
                    System.out.print(" ");
                }
                // 打印星号
                System.out.println("*");
            }
        }
    }
}

方式二

思路: 和C语言实现的方式二是一样的看成数组处理。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNextLine()) {
            String str = scanner.nextLine();

            // 将字符串转换为 基本数据类型
            int n = Integer.parseInt(
                        str); // 已经是字符串了就不要再加双引号了

            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    // 行号 == 列号 打印星号
                    if (i == j ) {
                        System.out.print("*");
                    } else {  // 否则打印空格
                        System.out.print(" ");
                    }
                }
                System.out.println();
            }
        }
    }
}


64. BC67 正斜线形图案

正斜线形图案_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现

方式一:

思路: 多组输入,找规律,先打印空格,再打印星号。

#include<stdio.h>

int main()
{
    int n = 0;

    while(~scanf("%d",&n)) 
    {
        for(int i = 0; i < n; i++) 
        {
            // 处理空格
            for(int j = 0; j < n -1-i; j++)
            {
                printf(" ");
            }
            // 打印星号
            printf("*\n");

        }
    }
    return 0;
}


方式二:

思路 将需要打印显示的图案,看成是一个数组,其中当 行 + 列 = n -1 时的下标位置刚好就是 打印显示星号的下标位置。

在这里插入图片描述

#include<stdio.h>

int main()
{
    int n = 0;

    while(scanf("%d",&n) != EOF) 
    {
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
            {
                // 当 行 + 列 = n -1 时打印星号
                if(i + j == n-1)
                {
                    printf("*");
                }
                else 
                {
                    printf(" ");
                }
            }
            printf("\n");
        }
    }

    return 0;
}

java实现

方式一

思路 和C语言实现的方式一是一样的

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNext()) {
            String str = scanner.nextLine();

            // 将字符串转为为 基本数据类型
            int n = Integer.parseInt(
                        str);  // 已经是字符串了就不要再加“双引号”了
            for (int i = 0; i < n; i++) {
                // 注意一个行的空格的个数是,n -1个的
                // 打印空格
                for (int j = 0; j < n - 1 - i; j++ ) {
                    System.out.print(" ");
                }
                System.out.println("*");
            }
        }
    }
}

方式二:

思路 和C语言实现的方式二是一样的,数组,行 + 列 = n-1 打印星号

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNext()) {
            String str = scanner.nextLine();

            // 将字符串转为基本数据类型
            int n = Integer.parseInt(
                        str); // 已经是字符串了就不要加“双引号”了

            for (int i = 0 ; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    // 行 + 列 = n -1; 打印星号
                    if (i + j == n - 1) {
                        System.out.print("*");
                    } else {  // 否则打印空格
                        System.out.print(" ");
                    }
                }
                System.out.println();
            }
        }
    }
}


65. BC68 X形图案

X形图案_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现

思路: 实际上观察,将其整体看做一个数组。我们可以发现,其中这个 x 就是 上面我们下实现的 正斜线( 行 + 列 = n -1 ) + 反斜线( 行 == 列) 的组合;而已。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>

int main()
{
    int n = 0;
    
    while(scanf("%d",&n) != EOF) 
    {
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++) {
                // 打印反斜线 行 == 列
                if( i == j) 
                {
                    printf("*");
                }
                // 打印正斜线: 行 + 列 = n -1;
                else if( i + j == n - 1) 
                {
                    printf("*");
                }
                else  // 打印空格
                {
                    printf(" ");
                }
            }
            printf("\n");
        }
    }

    return 0;
}

java实现

思路: 和C语言实现是一样的

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNext()) {
            String str = scanner.nextLine();

            // 将字符串转换为 int 基本数据类型
            int n = Integer.parseInt(
                        str); // 已经是字符串了就不要加"双引号"了

            for (int i = 0; i < n; i ++) {
                for (int j = 0; j < n; j++) {
                    // 打印反斜线: 行 == 列
                    if ( i == j ) {
                        System.out.print("*");
                    } else if (i + j == n - 1) { // 打印正斜线: 行 + 列 = n -1
                        System.out.print("*");
                    } else { // 打印空格
                        System.out.print(" ");
                    }
                }
                System.out.println();
            }
        }
    }
}


66. BC69 空心正方形图案

空心正方形图案_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现

思路: 整体看作是一个数组,找规律,起始行和结尾行( if( i == 0 || i == n -1)) 星号覆盖,起始列和结尾列 (j == 0 || j == n -1) 星号覆盖。其余空格: 需要注意的是 这里的空格打印是以 ”两个空格“为一组的

在这里插入图片描述

#include <stdio.h>

int main()
{
    int n = 0;

    while(scanf("%d",&n) != EOF) {
        for(int i = 0; i < n; i++) 
        {
            for(int j = 0; j < n; j++) {
                //  开头和结尾的两行星号覆盖
                if( i == 0 || i == n -1) 
                {
                    printf("* "); // 附加空格
                    
                } // 处理 起始列和结尾列,星号覆盖
                else if(j == 0 || j == n -1) 
                {
                    printf("* "); // 附加空格
                } 
                else  // 空格处理
                {
                    printf("  "); // 注意是两个空格为一组
                }
            }
            printf("\n");
        }
    }

    return 0;
}

java实现

思路: 和C语言实现的思路一样,看做是一个数组

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNext()) {
            String str = scanner.next();

            // 将字符串转换为 int 基本数据类型
            int n = Integer.parseInt(
                        str); // 已经是字符串了就不要加 "双引号"了

            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    // 起始行和结尾行: i == 0 || i = n-1 星号覆盖
                    if ( i == 0 || i == n - 1) {
                        System.out.print("* "); // 附加空格
                    } else if (j == 0 ||
                               j == n - 1) { // 起始列和结尾列: j == 0 || j = n -1 星号覆盖
                        System.out.print("* ");  // 附加空格
                    } else {  // 其余空格处理: 这里以两个空格为一组
                        System.out.print("  ");
                    }
                }
                System.out.println();
            }
        }
    }
}


67. BC70 空心三角形图案

空心三角形图案_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现

思路: 将打印看成是一个整体,一个整体的数组:起始列( j == 0) ,结尾行( j == n -1),i == j 都是星号覆盖,其余的空格覆盖,注意:这里的空格以 "两个空格"为一组的。

在这里插入图片描述

#include <stdio.h>

int main()
{
    int n = 0;
    while(~scanf("%d",&n)) 
    {
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++) 
            {
                // 起始列,结尾行, i == j 下标位置 星号覆盖
                if((i == j) || ( j == 0) || (i == n -1))
                {
                    printf("* ");  // 附加空格
                }
                else // 其余空格: 这里的空格:两个空格为一组
                {
                    printf("  ");
                }

            }
            printf("\n");
        }
    }

    return 0;
}

Java实现

思路: 和C语言实现的思路是一样的,看作是一个数组整体处理

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNext()) {
            String str = scanner.next();

            // 将字符串转换为 int 的基本数据类型
            int n = Integer.parseInt(
                        str); // 已经是字符串了就不要再附加 "双引号"了
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    //起始列,结尾行,i == j 星号覆盖
                    if ((j == 0) || (i == n - 1) || (i == j)) {
                        System.out.print("* "); // 附加空格
                    } else {  // 其余空格: 以两个空格为一组
                        System.out.print("  ");
                    }
                }
                System.out.println();
            }
        }
    }
}


总结:

  1. 注意C语言和Java的多组数据输入的方式。
  2. 注意对于一些图案上的打印显示:两个方面的技巧:
    1. 使用 两个 for 循环行,列上的控制,一些比较复杂的图案处理,找规律,通过使用 for 循环进行 上下部分 的分隔开来单独的打印处理。
    2. 使用两个 for 循环,将图案的打印看作是一个二维数组的整体 部分,找规律,控制二维数组下标的处理,达到对应图案的显示。如:在这里插入图片描述
      在这里插入图片描述

在这里插入图片描述

  1. 对应图案的打印显示:注意空格上的附加:比如 “*” 后面附加空格,以及两个空格为一组的。

最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,江湖再见,后会有期 !!!

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值