130道基础OJ编程题之: 58 ~ 67 道
文章目录
- 130道基础OJ编程题之: 58 ~ 67 道
- 0. 昔日OJ编程题:
- 58. BC61 金字塔图案
- 59. BC62 翻转金字塔图案
- 60. BC63 菱形图案
- 61. BC64 K形图案
- 62. BC65 箭形图案
- 63. BC66 反斜线形图案
- 64. BC67 正斜线形图案
- 65. BC68 X形图案
- 66. BC69 空心正方形图案
- 67. BC70 空心三角形图案
- 总结:
- 最后:
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();
}
}
}
}
总结:
- 注意C语言和Java的多组数据输入的方式。
- 注意对于一些图案上的打印显示:两个方面的技巧:
- 使用 两个 for 循环行,列上的控制,一些比较复杂的图案处理,找规律,通过使用 for 循环进行 上下部分 的分隔开来单独的打印处理。
- 使用两个 for 循环,将图案的打印看作是一个二维数组的整体 部分,找规律,控制二维数组下标的处理,达到对应图案的显示。如:
- 对应图案的打印显示:注意空格上的附加:比如 “*” 后面附加空格,以及两个空格为一组的。
最后:
限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,江湖再见,后会有期 !!!