首页 > 代码库 > nyoj 155 求高精度幂 【大数】

nyoj 155 求高精度幂 【大数】

做了一下午,总算做出来了!!

思路:将R转换成整数,同时计算好小数的个数,计算整数的次幂之后,然后根据规律将小数点适当的时候输出(如有3位实际小数,则应在第36位输出小数点)

链接http://acm.nyist.net/JudgeOnline/problem.php?pid=155

代码:

 
#include<stdio.h>
#include<string.h>
int main()
{
	int i, j, n, doc, ans[200]; //doc是逗号后面实际的位数
	char s[20];
	while( scanf( "%s %d", s, &n ) == 2 ){
		if( n == 0 ){
			printf( "1\n" );
			continue;
		}
		memset( ans, 0, sizeof(ans) ); 
		int len = strlen(s); 
		int real = 0;//是去掉小数点之后的实际整数
		int flag1 = 1;//标记前面不是0的数
		int flag = 0; //标记逗号出现 
		doc = 0;
		int k = 0;
		int sum = 0; //sum是小数点后面没有作用的0的个数
		for( i = 0; i < len; i ++ )
		if( s[i] == '.'){
			flag = 1;
			break;
		}
		if( flag ){ //如果有逗号 
		for( i = len-1; i >= 0; i -- ){
			if( s[i] == '0'&&flag1 ){
			 ++sum;
			 continue;
			}
			else{ 
				flag1 = 0;
				if( s[i] == '.' ){
					flag1 = 0;
					doc = len-i-sum-1; 
					continue;
				} 
			}
			ans[k++] = s[i]-'0';
		}
		} 
		else{ //如果没逗号
			for( i = len-1; i >= 0; i -- ){
				ans[k++] = s[i]-'0';
			}
		}
		for( i = k-1; i >=0; i -- )
		real = real*10+ans[i];
		for( i = 1; i < n; i ++ ){
			int c = 0;
			for( j = 0; j < 199; j ++ ){
				int s = ans[j]*real+c;
				ans[j] = s%10;
				c = s/10;
			}
		}
		for( i = 199; ans[i]==0&&i>=n*doc; i -- );
		for( j = i; j >= 0; j -- ){
			if( j == n*doc-1 )
			printf( "." );
			printf( "%d", ans[j] ); 
		}
		 printf( "\n" );
	}
	return 0;
}