题目链接:http://poj.org/problem?id=1001
题目大意:给定一个0.0-99.999之间的数R,再给定一个n,问R^n等于多少?如果整数部分为0,则0不输出,如果小数部分末尾为0,则不输出0,如果小数点后面都没数,不输出小数点。
解题思路:刚做完四级听力,发现做20道,对了3道,没有勇气再听下去,所以来切水题。本来想切几题再睡的,没想到第一题就是比较复杂的模拟,模拟计算小数的n方。没什么好说,模拟之模拟之
测试数据:
99.998 25
0.0001 1
1.0100 12
1.0100 2
代码:
#include <stdio.h>
#include <string.h>
#define MAX 120
int posnum,decnum;
int n,maxlen,endlen;
int res[MAX],base[MAX];
char num[MAX],ans[MAX];
void Initial() {
int i,j,k;
posnum = decnum = 0;
maxlen = strlen(num);
memset(ans,'0',sizeof(ans));
for (j = 0; num[j] != '.'; ++j); //获取小数点位置
for (i = maxlen - 1; i >= j;) //去除小数部分末尾的0
if (num[i] == '0') i--,maxlen--;
else break;
for (i = 0; i < maxlen; ) //去除整数部分前端的0
if (num[i] == '0') ++i;
else break;
for (k = 0,j = i; j < maxlen; ++j)
if (num[j] != '.') {
//整数部分先存入ans数组
ans[k++] = num[j];
posnum++;
}
else {
//小数部分存入ans数组
decnum = maxlen - j - 1;
for (j ++; j < maxlen; ++j)
ans[k++] = num[j];
break;
}
ans[k] = '\0';
maxlen = k;
strcpy(num,ans);
}
void Solve() {
int i,j,k,tpk,tpres[MAX];
memset(res,0,sizeof(res));
memset(base,0,sizeof(base));
for (i = 0; i < maxlen; ++i)
res[i] = base[i] = num[maxlen - i - 1] - '0';
for (i = 1; i < n; ++i) {
//模拟乘法运算
memset(tpres,0,sizeof(tpres));
for (j = 0; j < maxlen; ++j)
for (k = j; k < MAX; ++k){
tpres[k] += res[k-j] * base[j];
for (tpk = k; tpres[tpk] >= 10; ++tpk)
tpres[tpk+1] += tpres[tpk] / 10,tpres[tpk] %= 10;
}
memcpy(res,tpres,sizeof(tpres));
}
for (i = MAX - 1; i >= 0 && !res[i]; --i);
endlen = i + 1;
}
void Print() {
int i,j,k;
if (endlen <= decnum * n) {
//整数部分没有内容
printf(".");
for (i = decnum * n - endlen; i > 0; --i)
printf("0");
for (i = endlen - 1; i >= 0; --i)
printf("%d",res[i]);
}
else {
//两部分都有内容,都要输出
k = endlen - decnum * n;
for (i = endlen - 1; k > 0; --i,--k)
printf("%d",res[i]);
if (decnum != 0) printf(".");
for (;i >= 0; --i)
printf("%d",res[i]);
}
printf("\n");
}
int main()
{
int i,j,k;
while (scanf("%s%d",num,&n) != EOF) {
Initial();
Solve();
Print();
}
}
本文ZeroClock原创,但可以转载,因为我们是兄弟。