今晚看到一个朋友发了一个面试题,题目是这样:
编写一个程序,计算整形数A除以整形数B的结果,精确到小数点1000位。(C#或C++实现)
执行类似下图:
一开始,我想到的是浮点运算,但是做来做去,还是没有结果。于是用笔在纸上计算了这个过程,我发现,每次我们用被除数来除除数时,其实都是将 被除数扩大10倍再去除以除数,那么在程序中,我们是不是也可以将被除数扩大10除以除数得到第一个小数位,然后再将余数当做下次运算的除数再扩大10倍,再去除以除数,其实就是用整型运算来完成成个过程。是的,经过调试发现,的确是这样。思路大概是这样,话不多说,我想这比朋友给我说的网上找大数算法更灵活一些,不管要精确到几位,只要你的计算机内存够大,100亿位也行。下面给出程序:
#include <iostream>
using namespace std ;
int _tmain(int argc, _TCHAR* argv[])
{
int iBit = 0, dividend, divisor, checknumber ;
int ifneednode = 1 ;
char *value ;
char *value_char ;
cout<<"输入被除数:";
cin>>dividend;
cout<<"输入除数:";
cin>>divisor ;
cout<<"输入要精确的小数位:";
cin>>iBit ;
value = (char*)malloc(sizeof(char)*iBit) ;
value_char = (char*)malloc(sizeof(char)*2) ;
value[0] = '\0' ;
//当被除数大于除数时,先处理整数部分.
if( dividend > divisor )
{
do{
checknumber = dividend/divisor ;
_itoa(checknumber,value_char,10) ;
dividend = dividend%divisor ;
if( checknumber )
strcat(value,value_char) ;
}while( checknumber );
ifneednode = 0 ;
}
if( ifneednode)
strcat(value,"0.") ;
else
strcat(value,".") ;
while( iBit-- )
{
_itoa(((dividend*10)/divisor),value_char,10) ;
dividend = dividend*10%divisor ;
strcat(value,value_char) ;
}
cout<<value<<endl;
system("pause") ;
return 0;
}