做了一下午,总算做出来了!!
思路:将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; }
nyoj 155 求高精度幂 【大数】,布布扣,bubuko.com
原文:http://blog.csdn.net/shengweisong/article/details/33785223