问题描述
某天,acm的小秋拿到了一张很大很大的纸。他现在打算把它撕成正方 形。但是他没有任何工具,没有尺子,所以他尝试一种有趣的方法切分矩形。假设这是一个a*b的矩形(a>b),那么小秋会先把矩形的一个角如图所示 折起,这样右边就会形成一个正方形,然后把正方形切割出来,如果还存在长方形,小秋会继续这样把正方形切出来,现在要求你编写程序,输出小秋这样做最终能 得到多少个正方形。
输入要求
输入数据有多组。
每个测试数据占一行,有两个整数a,b分别代表小秋所拿到的纸的长和宽(1 ≤ b < a ≤ 10^12)
输出要求
输出结果,输出占一行。
测试数据示例
输入
2 1
10 7
10 7
输出
2
6
6
今天做了一下学校的新生赛题,觉得还是挺好玩的。有一些几何题确实需要思考优化,暴力就会TLE.
首先,假如b是a的因子,即 a%b ==0,那么,不难想,可以知道当前情况下生成的正方形数 a/b 个.
那么当a%b !=0 时,就是说需要减掉一部分的正方形,然后再判断a%b==0,就可以啦。
上代码
#include <stdio.h> long long slove(long long a,long long b){ long long ret = 0; while(a!=b){ if(a<b){ int t = b; b = a; a = t; } if(a%b==0){ return ret+(a/b); }else{ ret+=a/b; a=a-(b*(a/b)); } } if(a==b) ret++; return ret; } int main(){ long long a,b; while(scanf("%lld %lld",&a,&b)==2){ printf("%lld\n",slove(a,b)); } return 0; }