题目链接: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原创,但可以转载,因为我们是兄弟。