求一个整数B,对于一个小于1大于0的浮点数A,如何求出最小的数B,使得A*B的结果是一个整数(小数部分为0)
如题,求一个整数B,对于一个小于1大于0的浮点数A(如0.625),如何求出最小的数B,使得A*B的结果是一个整数,
举例:
A=0.625,那么A*1000=625,1000符合条件;A*8=5,8也符号条件,那么B应该为8。
A也可能等于一个其他的浮点数,如0.005137。
求解,谢谢
[解决办法]
设此数 A = 0.a1 a2 a3 a4... aN.
那么 A * 10^N = a1 a2 a3 a4...aN.
显然B = 10^N,符合。
又因为要使得B最小,那么也就是说从B可以约掉 B 与 a1 a2 a3 a4...aN的最大公约数。
又因为10^N的质因子只有2跟5.
所以很简单,如果 a1 a2 ...aN这个数有因子2跟5,那么就从10^N中约去相应个数的2跟5,得到的结果便是。
[解决办法]
这个题目跟计算机的浮点数表示精度有关,计算机的浮点数表示精度越高,你的输入的浮点数允许出现连续0的个数就可以越大。
这个程序在一定精度范围内可以满足你的要求。
#include <stdio.h>#include <stdlib.h>#define PRECISION_INPUT 0.00000001//这个精度是你的输入的浮点数的精度#define PRECISION_OFFSET 0.00000000000000009//这个精度是计算机表示的浮点数的精度int foo(double des){ double des_copy = des + PRECISION_OFFSET; int power = 1; int des_copy_int = des_copy; while(des_copy - des_copy_int > PRECISION_INPUT) { power *= 10; des_copy *= 10; des_copy_int = des_copy; } while(des_copy_int%2 == 0 && power%2 == 0) { des_copy_int /= 2; power /= 2; } while(des_copy_int%5 == 0 && power%5 == 0) { des_copy_int /= 5; power /= 5; } return power; }void main(){ printf("%d\n", foo(0.6200051));}