首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

整数B,对于一个小于1大于0的浮点数A,怎么求出最小的数B,使得A*B的结果是一个整数(小数部分为0)

2012-08-29 
求一个整数B,对于一个小于1大于0的浮点数A,如何求出最小的数B,使得A*B的结果是一个整数(小数部分为0)如题,

求一个整数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的个数就可以越大。
这个程序在一定精度范围内可以满足你的要求。

C/C++ code
#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));} 

热点排行