Poj 1001 Exponentiation (模拟)

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值