求助,WA2过不了,实在找不到原因
查看原帖
求助,WA2过不了,实在找不到原因
1303139
Yezi_Mooyee楼主2024/3/16 16:49

我去看了题解,大部分思路和我的差不多,但我就是差一个点过不去
题目中的示例是正确的

评测编号是 R151132571

这是代码:

#include<bits/stdc++.h>
using namespace std;

//高精度数与一个int相乘
//参数:数A(高精度数),数A的有效长度,数B,答案
//返回:答案的有效长度
unsigned int high_precision_multiply
(unsigned int *numA, unsigned int numA_length, unsigned int numB, unsigned int *answer)
{
	unsigned int carry = 0;//进位
	for (unsigned int i = 0; i < numA_length; i++)
	{
		unsigned long long answer_this;//本次答案
		//按位相乘,加上上次的进位
		answer_this =
		(unsigned long long)numA[i] * (unsigned long long)numB + carry;
		//此时answer_this的61:31位是进位,30:0是本位结果
		carry = (unsigned int)(answer_this >> 31);
		answer[i] = (unsigned int)answer_this & ~(1<<31);//取低31位
	}
	if(carry != 0)
	{
		answer[numA_length] = carry;
		return numA_length +1;
	}
	else
	{
		return numA_length;
	}
}

//高精度数除以一个int
//参数:数A(高精度数),数A的有效长度,数B,答案
//返回:高32位为余数,低32位为答案的有效长度
unsigned long long high_precision_divide
(unsigned int *numA, unsigned int numA_length, unsigned int numB, unsigned int *answer)
{
	unsigned int answer_length = numA_length;
	if (numA[numA_length -1] < numB)
	{
		answer_length--;
	}
	unsigned int remainder = 0;//余数
	for (int i = numA_length -1; i >= 0; i--)
	{
		unsigned int answer_this;//本次答案
		unsigned long long dividend_this;//本次被除数
		dividend_this =
		(unsigned long long)numA[i] | (unsigned long long)remainder<<31;
		answer_this = dividend_this / numB;
		remainder = dividend_this % numB;
		answer[i] = answer_this;
	}
	return (unsigned long long)remainder << 32 | (unsigned long long)answer_length;
}

unsigned int a[1024 * 1024];
unsigned int answer_dec[1024 * 1024];//十进制的结果

void one_term(unsigned int n, unsigned int m, int scale)
{
	scale *= m;//答案的小数位数
	unsigned int a_length = 1;
	a[0] = n;
	for (unsigned int i = 1; i < m; i++)
	{
		a_length = high_precision_multiply(a, a_length, n, a);
	}

	unsigned int answer_dec_i;//十进制结果的指针
	for (answer_dec_i = 0; a_length > 0; answer_dec_i++)
	{
		unsigned long long answer_this =
		high_precision_divide(a, a_length, 10, a);
		answer_dec[answer_dec_i] = (unsigned int)(answer_this >> 32);
		a_length = (unsigned int)answer_this;
	}

	//计算尾随0的数量
	int traling_0_count = 0;//尾随0的计数
	for (int i = 0; i < scale; i++)
	{
		if (answer_dec[i] == 0)
		{
			traling_0_count ++;
		}
		else
		{
			break;
		}
	}
	//计算前导0数量
	int leading_0_count = 0;//前导0的计数
	for (int i = answer_dec_i-1; i >= scale; i--)
	{
		if (answer_dec[i] == 0)
		{
			leading_0_count ++;
		}
		else
		{
			break;
		}
	}
	
	//输出小数点之前的部分
	for (int i = answer_dec_i-leading_0_count-1; i >= scale; i--)
	{
		printf("%d", answer_dec[i]);
	}

	if (scale > traling_0_count)
	{
		printf(".");
	}
	
	
	//输出小数点之后的部分
	for (int i = scale-1; i >= traling_0_count; i--)
	{
		printf("%d", answer_dec[i]);
	}
	printf("\n");

	return;
}

int main(int argc, char const *argv[])
{
	unsigned int n;//底数
	unsigned int m;//指数
	int scale;//小数位数
	string n_str;//字符串形式的n,我们将从中得到n和scale
	
	while (cin>>n_str>>m)
	{
		n = 0;
		scale = 0;

		//将字符串形式的小数转换为一个整数和一个小数点位置
		bool can_count_scale = false;//是否可以计数小数位数
		for (int i = 0; i < n_str.size(); i++)
		{
			if (n_str[i] == '.')
			{
				can_count_scale = true;
				continue;
			}
			n = n*10+n_str[i]-'0';
			if (can_count_scale)
			{
				scale++;
			}
		}

		one_term(n,m,scale);
	}


	
	return 0;
}


2024/3/16 16:49
加载中...