King's Cake
Accepts: 960
Submissions: 1572
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
阅兵式前一天,是国王的生日,大臣们为他准备了一个 n×m(1≤n,m≤10000)n \times m(1\le n, m \le 10000)n×m(1≤n,m≤10000) 的蛋糕。他准备切蛋糕,但他切蛋糕有奇奇怪怪的癖好,他每次只切一刀,切下一个正方形蛋糕。请问它最多能切出多少个正方形蛋糕?
输入描述
第一行一个整数表示测试组数:T(0<T≤1000)T(0 < T\le1000)T(0<T≤1000) 。 每组数据占一行,每行两个整数 n×m(1≤n,m≤10000)n \times m(1\le n, m \le 10000)n×m(1≤n,m≤10000),表示蛋糕的大小。
输出描述
共 TTT 行,每行一个整数表示最多能切出的正方形蛋糕数量。
输入样例
2 2 3 2 5
输出样例
3 4
Hint
对于第一组数据,可切出一个 2×22\times22×2, 两个 1×11\times 11×1,共 333 个。 对于第一组数据,可切出两个 2×22\times22×2, 两个 1×11\times 11×1,共 444 个。
官方题解给的就很好,可以考虑看官方题解的图。
我这里模拟直接敲的。一刀两块,一块正方形,一块矩形(当然也可能都是正方形),一直切,一直到n或者m切到1或者是n==m的时候,跳出循环。
AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
int output=0;
while(1)
{
if(n==m)
{
output++;
break;
}
if(n==1)
{
output+=m/n;
break;
}
if(m==1)
{
output+=n/m;
break;
}
int maxn=max(n,m);
int minn=min(n,m);
int b=maxn-minn;
int a=minn;
n=b;
m=a;
output++;
}
printf("%d\n",output);
}
}