今晚看到一个朋友发了一个面试题,题目是这样:编写一个程序,计算整形数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; }