51 Nod 1873 初中的算术

1873 初中的算术

基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
收藏
关注

Noder现在上初三了,正在开始复习中考。他每天要计算型如 (a× a× a× × a)na 的式子。 其中 0.0<a<99.999,0<n<26 。

虽然Noder会计算,但是老是算错,现在他想要你来写一个程序输出正确的结果,以便他核对。


Input
单组测试数据。
第一行有一个实数a和一个整数n,中间用空格分开。 0.0 < a < 99.999,a总是占6位(a长度<=6),0<n<26。
Output
输出一个实数表示结果,不要输出前导0,后面多余的0也不要输出,如果是整数不要输出小数点。
Input示例
样例输入1
0.4321 20
样例输入2
1.0100 12
Output示例
样例输出1
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
样例输出2
1.126825030131969720661201

题意:》》》

思路:仿照大整数乘法,记录小数点的位置,然后将输入当成整数来进行乘法,最后加上小数点即可;

下面附上我的代码:

#include<bits/stdc++.h>
using namespace std;
char s[1005];
struct BigNum
{
	int len;
	int num[1005];
	int point;
	BigNum init()
	{
		len=1;
		memset(num,0,sizeof(num));
		point=0;
	}
};
BigNum Mul(BigNum &a,BigNum &b)
{
	BigNum c;
	c.init();
	c.point=a.point+b.point;
	for(int i=0;i<a.len;i++)
		for(int j=0;j<b.len;j++)
		{
			c.num[i+j]+=a.num[i]*b.num[j];
			if(c.num[i+j]>=10)
			{
				c.num[i+j+1]+=(int)c.num[i+j]/10;
				c.num[i+j]%=10;
			}
		}
	int len=a.len+b.len;
	while(c.num[len-1]==0&&len>1&&len>c.point) len--;
	if(c.num[len])
		len++;
	c.len=len;
	return c;
}
int main()
{
	int n,t=0;
	cin>>s>>n;
	if(n==0)
	{
		puts("1");
		return 0;
	}
		
	BigNum d,ans;
	ans.init();
	int l=strlen(s);
	for(int i=l-1;i>=0;i--)
	{
		if(s[i]=='.')
		{
			d.point=t;
			continue;
		}
		d.num[t++]=s[i]-'0';
	}
	d.len=t;
	ans=d;
	for(int i=0;i<n-1;i++)
		ans=Mul(ans,d);
	int f=ans.point;
	for(int i=0;i<ans.len&&i<ans.point;i++)
	{
		if(ans.num[i])
		{
			f=i;
			break;
		}
	}
	for(int i=ans.len-1;i>=0;i--)
	{
		if(i==ans.point-1)
			cout<<'.';
		printf("%d",ans.num[i]);
		if(i==f)
			break;
	}
	printf("\n");
	return 0;
}
 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值