设有一个N \times MN×M方格的棋盘(1≤N≤100,1≤M≤100)(1≤N≤100,1≤M≤100)
求出该棋盘中包含有多少个正方形、多少个长方形(不包括正方形)。
例如:当N=2,M=3时:
正方形的个数有8个:即边长为11的正方形有6个;
边长为22的正方形有2个。
长方形的个数有10个:
即
2×1的长方形有4个
1×2的长方形有3个:
3×1的长方形有2个:
3×2的长方形有1个:
如上例:输入:2,3
输出:8,10
此题实质是道数学题可以用找规律找出公式也可硬刚一个一个找,以下解法为第二类,解法1为我在洛谷题解找到的,解法2是我根据解法一自己想出的
解法一:
#include<stdio.h>
int main()
{
int x, y, z=0, c=0, i, j, k, l; //z用来记正方形个数,c来记长方形
scanf("%d%d", &x, &y); //输入长(x)宽(y)
for (i = 0; i <= x; i++) //枚举
for (j = 0; j <= y; j++) //枚举
for (k = i + 1; k <= x; k++) //还是枚举
for (l = j + 1; l <= y; l++) //仍然是枚举
if (k - i == l - j)z++; //是正方形
else c++; //是长方形
printf("%d %d\n", z, c);
return 0;
}
解法2:
#include<stdio.h>
int main() {
int chang = 0, kuan = 0, zheng = 0, changfan = 0, b;
scanf("%d%d", &chang, &kuan);
for (;;) {
for (int x = 1; x <= chang; x++) {
b = kuan;
for (;;) {
for (int y = 1; y <=b; y++) {
if (x == y) {
zheng++;
}
else {
changfan++;
}
}
b--;
if (b == 0)break;
}
}
chang--;
if (chang == 0)break;
}
printf("正=%d 长=%d\n", zheng, changfan);
return 0;
}
解法已给出相必大家第一次看是应该看不懂,我来解释下,这种解法为从棋盘自左向右,子下而上,进行找