现在的位置: 首页 > 综合 > 正文

要求两数相除,结果精确到1000位的一种简单做法。

2013年05月31日 ⁄ 综合 ⁄ 共 1075字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.