https://www.cnblogs.com/ECJTUACM-873284962/p/6390125.html
1588 辗转数对
题目
假设当前有一个数对(a, b),我们可以通过一步将这个数对变为一个新数对(a + b, b)或者是(a, a + b)。初始的数对为(1, 1),你的任务是找到一个数字k,即通过最少的步数使得这个数对中至少一个数字等于n。
输入
输入包括多组数据,每组数据包括一行,每行有一个整数n。
输出
每组数据输出一行,每行一个整数。
例子:
输入
5
3
输出
3
2
这道题刚开始做的时候认为是一个斐波那契,但是做下去的时候却发现存在不满足的情况,而且原理根本不一样,而从(1,1)开始进行(a,b)的相加,得出的任意一组a和b都是互质的。
后来看了一下 这里 ,感觉solve和gcd那一块用的太巧妙了。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int gcd(int x,int y) 4 { 5 if(y==0)return x; 6 else return gcd(y,x%y); 7 } 8 int solve(int x,int y) 9 { 10 if(x==1)return y-1; 11 if(y==1) return x-1; 12 return (x-x%y)/y+solve(y,x%y); 13 } 14 int main() 15 { 16 int n,i,output; 17 while(cin>>n) 18 { 19 output=0x3f3f3f3f; 20 for(i=1;i<=n;i++) 21 { 22 if(gcd(i,n)==1) 23 output=min(solve(i,n),output); 24 } 25 cout<<output<<endl; 26 } 27 return 0; 28 }
可以记一下gcd来保持互质的一个固定用法:
int gcd(int x,int y) { if(y==0)return x; else return gcd(y,x%y); }