【poj 1001】高精密度幂运算

思路就是将每位数字分别存入一个整数数组中,并记录小数点的位置,循环相乘,按列相加因子,并进位去权,和我们草稿纸上算乘法差不多,循环n次

 1 #include <fstream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7 
 8     int g = 0 , h , i , j , k , p , q , n , B[6] , BW , P , C[500] , CW , D[500] , SSS[500][500] , WWW[500] , PPP[500] , NUM , ZERO ;
 9     int table[10][10] ={0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,
10                         0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 ,
11                         0 ,  2 ,  4 ,  6 ,  8 , 10 , 12 , 14 , 16 , 18 ,
12                         0 ,  3 ,  6 ,  9 , 12 , 15 , 18 , 21 , 24 , 27 ,
13                         0 ,  4 ,  8 , 12 , 16 , 20 , 24 , 28 , 32 , 36 ,
14                         0 ,  5 , 10 , 15 , 20 , 25 , 30 , 35 , 40 , 45 ,
15                         0 ,  6 , 12 , 18 , 24 , 30 , 36 , 42 , 48 , 54 ,
16                         0 ,  7 , 14 , 21 , 28 , 35 , 42 , 49 , 56 , 63 ,
17                         0 ,  8 , 16 , 24 , 32 , 40 , 48 , 56 , 64 , 72 ,
18                         0 ,  9 , 18 , 27 , 36 , 45 , 54 , 63 , 72 , 81 }; //九九乘法表
19     char buf[7] ;
20 
21     while ( scanf( "%s%d" , buf , &n ) == 2 )
22     {
23         memset( B , 0 , sizeof(B) );                    //初始化数组
24         memset( C , 0 , sizeof(C) );
25         C[1] = 1 ; CW = 1 ;
26         memset( D , 0 , sizeof(D) );
27 
28 
29         i = BW = P = 0 ; j= 5 ;
30         while ( buf[j] == '0' ) j-- ;       //去掉小数点后无效的0
31         while ( j >= 0 )
32         {
33             if ( buf[j] == '.' ) { P = i ; j-- ;}       //记录小数点的位置p,跳过小数点
34             B[++i] = buf[j--] - '0' ;                   //倒序的方式将读入的字符串中的数字逐个存入数组B,B[1]个位、B[2]十位,以此类推
35         }
36         BW = i ;
37         while ( B[BW] == 0 ) BW-- ;     //得到的整数B有BW位(去掉前导的0)
38 
39         for ( h = 1 ; h <= n ; h++ )
40         {
41             for ( i = 1 ; i <= BW ; i++ )
42             {
43                 k = i ;
44                 for ( j = 1 ; j <= CW ; j++ )
45                 {
46                     D[k++] += table[B[i]][C[j]] ;
47                 }
48             }
49             CW += BW ;                      //位的增加
50             C[1] = 0 ;
51             for ( i = 1 ; i < CW ; i++ )
52             {
53                 C[i] += D[i] ;              //累加
54                 D[i] = 0 ;
55                 C[i+1] = C[i] / 10 ;        //进位
56                 C[i] %= 10 ;                //去权
57             }
58             if ( C[CW] == 0 ) CW-- ;        //去首位0
59         }
60 
61 
62         P *= n ;    //小数点的移动
63         g++ ;
64 
65         for ( i = 1 ; i <= CW ; i++ ) SSS[g][i] = C[i] ;
66         WWW[g] = CW ; PPP[g] = P ;
67 
68     }
69 
70 
71     for ( h = 1 ; h <= g ; h++ )
72     {
73         j = 1 ;
74         ZERO = 0 ;
75         while ( SSS[h][j++] == 0 ) ZERO++;                   //定位小数点后无效的0
76         for ( k = WWW[h] ; k > PPP[h] ; k-- ) printf( "%d" , SSS[h][k] );
77         if ( PPP[h] > ZERO )
78         {
79             printf( "." ) ;
80             for ( k = PPP[h] ; k > ZERO ; k-- ) printf( "%d" , SSS[h][k] );
81         }
82         printf( "\n" ) ;
83     }
84 
85 }

 

 

posted @ 2013-05-03 18:41  活在二次元的伪触  阅读(255)  评论(0编辑  收藏  举报