【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 }