题目描述:
圣诞节快到了,校园里到处弥漫着粉红色的气息。又是一个情侣秀恩爱的节日。
作为一只在双十一剁手的单身狗,XX只能望着空荡荡的钱包欲哭无泪。XX琢磨着,得趁圣诞节的时候赚点外快,不然真得喝西北风去了。
但是能赚什么外快呢?批发苹果?没本金;卖贺卡?没本金;许愿灯?还是没本金……想来想去,做什么都没!本!金!这个残酷的世界啊,还给不给单身狗活路了!!!
最后还是心灵手巧,多才多艺的室友给了XX灵感——对,没错,就是题目——千纸鹤!
和其他的比起来,千纸鹤成本低廉到可以忽略不计。而最丧心病狂的是,XX为了节约成本,她都没直接去买可以叠千纸鹤的方块纸,而是自己买了白纸回来裁!!
而XX那奇葩的审美,让她觉得千纸鹤折越大越好看。所以她裁剪的时候,都是裁一块最大面积的正方形出来折千纸鹤。然后下一次又在剩余的纸中继续裁一块最大的正方形。
那么问题来了,一块长a宽b的长方形纸,在折完k只千纸鹤以后,还剩多大?
例如长为7宽为3的纸片,折完3只千纸鹤后,剩下的纸片为长2宽1。
输入:
输入只有一行,包括三个整数 a, b, k (0 < b <= a <= 10,000),分别表示纸片的长,宽,以及千纸鹤的个数。保证数据合法。
输出:
输出一行运算结果,结果为两个整数,分别表示剩余白纸的长和宽,数字以空格隔开,末尾要换行(长 >= 宽)。
样例输入:
1 1 1
样例输出:
0 0
解题思路:
虽然前面的情景描述看起来冗长没用(确实有些冗长,也确实没用),但这题的解体想法却一点不冗长。
假设已知长方形的长为a,宽为b。
想要使得到的正方形达到最大值,即要将长方形的宽b作为新正方形的边长,那么经过裁剪后得到的新长方形其中两条边长为k=a-b,另外两条边长为依然为a。
这个时候就要分情况考虑了。
一种是k>b的时候,那么我们就将k赋给长a,宽b依然为b。
另一种则是k<=b的时候,那么我们就将原宽b作为新长方形的长a,将k作为新长方形的b。
值得注意的是,但其中一条边变为零的时候,另一条边也将变成零(即样例输入和样例输出)
实现代码:
#include<stdio.h>
int main(void)
{
int a,b,k;
scanf("%d%d%d",&a,&b,&k);
while(k--)
{int k=a-b;
if(k>b)
{
a=k,b=b;
}
else
{
a=b;
b=k;
}
}
if(b==0)a=0;//也可以放到上面的循环内,当其中一条边为0时,就break
printf("%d %d",a,b);
}