做了一下午,总算做出来了!!
思路:将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;
}