1. 程式人生 > >大數,高精度計算---高精度冪次

大數,高精度計算---高精度冪次

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。

一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作一個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。

五  大數冪次。

 

問題來源:   《c程式設計競賽實訓教程》

 

問題描述:

計算國債對於計算機來說是一件很繁重的事情,該問題涉及到的精度很高。現需要你編寫一個程式用來計算R的n次方。  這裡R是一個實數(0.0<R<99.999),而n是一個整數.

 

問題分析:

計算結果的位數很長,還是涉及到大數的處理,不能用普通型別數表示,只能用陣列表示,類似於大數的做法,利用陣列來模擬手算過程。為了計算方便,陣列中將小數點去掉,記住其位置,然後只計算整數的冪次,最後將小數點在結果中的位置計算出來,放在結果中即可。

其實本質上也是大數乘法的一部分。只是這裡涉及了小數點的處理。

思想差不多,也就沒自己去寫。   下面的程式碼來自書中的例項原始碼。

 

#include<stdio.h>#include<string.h>#define N 200//函式mult功能:  實現p1中長度為len1的大數和p2中長度為len2的大數相乘,//結果儲存在p2中,同時返回結果的位長len2void Mult( int *p1, int *p2, int len1, int *len2 ){    int i, j, k, d, ts[N];    for
( i=0; i<N; i++ )        ts[i] = 0;    for ( i=0; i<len1; i++ )        for ( j=0; j<*len2; j++ )            ts[i+j] += p1[i] * p2[j];      //大數乘法    k = len1 + (*len2);                    //結果可能最大位長    while ( k>0 && ts[k]==0 )        k--;    k++;    for ( i=0,d=0; i<k; i++ )             //處理進位    {        p2[i] = ( ts[i] + d ) % 10;        d = ( ts[i] + d ) / 10;    }    if ( d>0 )                          //最高位進位    {        p2[i] = d;        k++;    }    *len2 = k;}int main(){    char str_a[10], str_b[N+1];    int i, t, j, k, len_a, len_b, n, pot;    int a[10], b[N];    scanf("%d",&t);        //讀入測試組數    while ( t-->0 )    {        scanf("%s%d", str_a, &n );        len_a = strlen(str_a);        k = len_a - 1;        while ( k>=0 && str_a[k] != '.' )       //找出小數點位置            k--;        if ( k<0 )               //小數點後的位數            pot = 0;        else        {            j  = len_a - 1;            while ( j>0 && str_a[j]=='0' )      //去掉小數點尾部的0                j--;            len_a = j + 1;            str_a[len_a] = '\0';            pot = len_a -k - 1;            //小數點後的位數        }        i = len_a - 1;        k = 0;        while ( i>=0 )        {            if ( str_a[i] != '.' )    //將大數顛倒存入並且去掉小數點                a[k++] = str_a[i] - '0';            i--;        }        for ( i=0; i<N; i++ )            b[i] = 0;        len_a = len_b = k;        for ( i=0; i<len_a; i++ )            b[i] = a[i];          //乘數相同        for ( i=1; i<n; i++ )            Mult( a, b, len_a, &len_b );       //做n-1次相乘        k = pot * n;             //小數點位置        n = len_b > k? len_b:k;        for ( j=0,i=n-1; i>=0; i-- )      //結果轉為字串        {            if ( i==k-1 )                str_b[j++] = '.';            str_b[j++] = b[i] + '0';        }        str_b[j] = '\0';        printf("%s\n",str_b);      //輸出結果    }    return 0;}


 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述