我去看了题解,大部分思路和我的差不多,但我就是差一个点过不去
题目中的示例是正确的
评测编号是 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;
}