uva748 ( 高精度 浮点数幂)

本文详细阐述了如何通过输入小数底数和整数指数,实现幂运算的过程。包括小数点位置处理、底数转数组、幂运算计算及结果输出等关键步骤。
部署运行你感兴趣的模型镜像

题意: 输入一个小数底,跟一个整数指数。输出幂。


思路:题目要注意输入的时候 要去掉前导零; 记录小数点位数(strchr()函数);


算法复杂度:o(N^2)N是底数位数。


代码:

#include <cstdio>
#include <cstring>
using namespace std;

#define MAX_N 2000

void toDigitReverse(char *, int *);
void toPow(int *, int, int, int *rslt);
void outputRslt(int *, int);
void toMultiply(int *, int, int *, int);

int main()
{
	char strR[MAX_N];
	int n;
	char *radixP;
	int radixNum;
	int digitR[MAX_N];
	int lenR;
	int rslt[MAX_N];

	while (scanf("%s %d", strR, &n) == 2) {
		// init
		memset(digitR, 0, sizeof(digitR));
		memset(rslt, 0, sizeof(rslt));
		
		// count radix num
		int tp_len = strlen(strR);
		for (int i = tp_len - 1; strR[i] == '0'; i--) {
			strR[i] = '\0';
		}
		radixP = strchr(strR, '.');
		radixNum = strlen(radixP + 1);
		radixNum = radixNum * n;

		// delete radix
		*radixP = '\0';
		radixP++;
		if (strR[0] == '0') {			//0.xxx
			strcpy(strR, radixP);
		}else {
			strcat(strR, radixP);
		}
		lenR = strlen(strR);

		// to digit
		toDigitReverse(strR, digitR);

		// to pow
		toPow(digitR, lenR, n, rslt);

		// to output
		outputRslt(rslt, radixNum);

		// end a cases
	}

	return 0;
}

void toDigitReverse(char *strR, int *digitR)
{
	int len = strlen(strR);
	for (int head = 0, tail = len - 1; head < len; head++, tail--) {
		digitR[head] = strR[tail] - '0';
	}
}

void toPow(int *digitR, int lenR, int n, int *rslt)
{
	// rslt = digit at first
	for (int i = 0; i < lenR; i++) {
		rslt[i] = digitR[i];
	}
	n--;
	for (int i = 0; i < n; i++)	{
		toMultiply(rslt, MAX_N, digitR, lenR);	 // xx to be continue
	}
}

void outputRslt(int *rslt, int radixNum)
{
	int tail;
	for (tail = MAX_N - 1; !rslt[tail] && tail >= radixNum; tail--) {
	}

	radixNum--;				// index of rslt is from 0 1 2
	while (tail > radixNum) {
		printf("%d", rslt[tail--]);
	}
	printf(".");
	while (tail >= 0) {
		printf("%d", rslt[tail--]);
	}
	printf("\n");
}

void toMultiply(int *rslt, int lenRslt, int *digitR, int lenR)
{
	int tmp[MAX_N];
	memset(tmp, 0, sizeof(tmp));

	for (int i = 0;  i < lenRslt; i++) {
		for (int j = 0; j < lenR; j++) {
			tmp[i + j] += rslt[i] * digitR[j];
		}
	}

	int ans = 0;
	for (int i = 0; i < MAX_N; i++) {
		rslt[i] = (tmp[i] + ans) % 10;
		ans = (tmp[i] + ans) / 10;
	}
}


您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值