这里和上一题关于gcd的都没有考虑大数运算相关的。
题目描述:求浮点数的精确表示
思路:通过分数来进行表示最精确,所以问题转化成了如何通过分数表示浮点数
(1)非循环小数:c.a(其中c表示一个整数,a表示一个整数),那么分数就是(c*(10^n)+a)/10^n,其中n为a的位数,最后约分
(2)循环小数:c.a(b)(b是循环部分)
假设b为m位,那么10^m*0.(b))= b + 0.(b),那么0.(b) = b/(10^m-1),
c.a(b) = (c*10^n+a+0.(b))/10^n = (c*10^n+a+b/(10^m-1))/10^n = (c*10^n*10^m-1+a*10^m-1+b)/10^m-1*10^n
#include <iostream> #include <queue> #include <climits> #include <algorithm> #include <memory.h> #include <stdio.h> using namespace std; static int num_1 = 0; static int num_2 = 0; static int num_3 = 0; int gcd_1(int a,int b) { if(b == 0) { ++num_1; return a; } else { ++num_1; return gcd_1(b,a%b); } } int gcd_2(int a,int b) { if(b == 0) { ++num_2; return a; } if(a < b) { ++num_2; return gcd_2(b,a); } ++num_2; return gcd_2(b,a-b); } int gcd_3(int a,int b) { ++num_3; if(b == 0) { return a; } if(a < b) { return gcd_3(b,a); } if(a & 1 == 0) { if(b & 1 == 0) { return (gcd_3(a>>1,b>>1)<<1); } else { return gcd_3(a>>1,b); } } else { if(b & 1 == 0) { return gcd_3(a,b>>1); } else { return gcd_3(b,a-b); } } } int main() { int c,a,b; scanf("%d.%d(%d)",&c, &a, &b); if (a==0 && b==0) cout << c; else { // 分子up,分母down long long up = c; long long down = 1; long long ta = a; while (ta) { down *= 10; ta /= 10; } up = c*down+a; if (b!=0) { long long wb = 1; long long tb = b; while (tb) { wb *= 10; tb /= 10; } up = up*(wb-1)+b; down = down*(wb-1); } long long fac = gcd_3(up, down); cout << up/fac << "/" << down/fac << endl; } return 0; }