d24
题目
题目背景
NOIP1997 普及组第一题
题目描述
设有一个 �×�N×M 方格的棋盘 (1≤�≤100,1≤�≤100)(1≤N≤100,1≤M≤100)
求出该棋盘中包含有多少个正方形、多少个长方形(不包括正方形)。
例如:当 �=2,�=3N=2,M=3 时:
正方形的个数有 88 个:即边长为 11 的正方形有 66 个;边长为 22 的正方形有 22 个。
长方形的个数有 1010 个:
即
- 2×12×1 的长方形有 44 个:
- 1×21×2 的长方形有 33 个:
- 3×13×1 的长方形有 22 个:
- 3×23×2 的长方形有 11 个:
输入格式
一行两个整数 �,�N,M。
输出格式
一行两个整数,表示正方形的个数与长方形的个数。
输入输出样例
输入 #1复制
2 3
输出 #1复制
8 10
思路
先分析正方形a*a
再分析长方形a*b
正方形:
控制一边始终为2,改变另一边的长度,找规律(类似于控制变量,这样更好找规律)
长方形
代码
import java.util.Scanner;
// 按两次 Shift 打开“随处搜索”对话框并输入 `show whitespaces`,
// 然后按 Enter 键。现在,您可以在代码中看到空格字符。
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
//m为长,n为宽
int n= in.nextInt();
int m= in.nextInt();
int a=0;//正方形个数
int b=0;//包括正方形个数的长方形个数
//此循环表示找i*i的正方形
//i表示正方形的边数,i从1到nm中更小的那一个
for (int i = 1; i <= Math.min(n,m); i++) {
a=a+(1+(m-i))*(1+(n-i));
}
//此循环表示找i*j的长方形
//i表示长,j表示宽,
for (int i = 1; i <=m ; i++) {
for (int j = 1; j <=n ; j++) {
b=b+(1+(m-i))*(1+(n-j));
}
}
System.out.println(a+" "+(b-a));
}
}
记录
找规律方法:控制一个量不变,改变另变量,找规律(类似于控制变量,这样更好找规律)