题目大意:给出一个占6个位的数M,这个数可能是个小数,也可能是个整数,然后再给出一个整数N,输出M^N
解题思路:因为有小数点,所以要先找出小数点所在的位置,找出小数点所在的位置之后,就可以求出N次方后有几个小数位了,但是这不是正确的,因为可能会再后缀加上很多0,所以还要预处理,M的小数位的无用零去掉.这样就能得到小数的数位了。然后将M看成是一个没有小数点的整数,再进行高精度乘法,得到整数的数位,得知小数的数位和整数的数位后,在输出的时候就可以进行判断,看是否要分段输出.
#include<cstdio>
#include<cstring>
#define maxn 150
int main() {
char str[6];
int num[maxn];
int t, n;
while(scanf("%s %d", str, &n) != EOF) {
memset(num,0,sizeof(num));
t = 0;
int pos = -1;
for(int i = 0; i <= 5; i++)
if(str[i] == '.')
pos = i;
else
t = t * 10 + str[i] - '0';
if(pos != -1) {
pos = 5 - pos;
pos *= n;
}
if(pos != -1) {
for(int i = 5; i >= 0; i--)
if(str[i] == '.' || str[i] != '0')
break;
else if(str[i] == '0') {
t = t / 10;
pos -= n;
}
}
num[0] = 1;
int temp = 0;
for(int i = 0; i < n; i++) {
temp = 0;
for(int j = 0; j < maxn; j++) {
int s = num[j] * t + temp;
num[j] = s % 10;
temp = s / 10;
}
}
int i;
for(i = maxn - 1; i >= 0; i--)
if(num[i])
break;
if(pos == 0 || pos == -1)
for(; i >= 0; i--)
printf("%d",num[i]);
else if(pos >= i + 1) {
printf(".");
for(int j = 0; j < pos - i - 1; j++)
printf("0");
for(; i >= 0; i--)
printf("%d",num[i]);
}
else {
for(; i >= pos; i--)
printf("%d",num[i]);
printf(".");
for(; i >= 0; i--)
printf("%d",num[i]);
}
printf("\n");
}
return 0;
}