大数乘法(带小数点)

这道题的核心是,将小数点先删除进行存储,并且记录小数的位数,例如

“0.234”存储为“234“小数点位数3,然后进行”234“与”234“的多次相乘最后把小数点加上

#include<iostream>
#include<string>
#include<vector>
#include<cstring>
#include <iomanip>

using namespace std;


typedef struct name
{
	string s;
	int point_num;
}name;
string multiply(string a, string b)//两个整型大数相乘
{
	int la = a.size();
	int lb = b.size();
	int lm = la + lb;
	string mul = "";
	mul.insert(mul.begin(), lm, '0');//两数相乘的积的最大位数为两数的位数和
	for (int i = la - 1; i >= 0; i--)
		for (int j = lb - 1, k = i + j + 1; j >= 0; j--, k--)
		{
			int temp = (mul[k] - '0') + (a[i] - '0')*(b[j] - '0');
			mul[k] = temp % 10 + '0';
			mul[k - 1] = (mul[k - 1] - '0') + temp / 10 + '0';
		}
	int num = 0;
	int k = 0;
	while (mul[k] == '0')
	{
		mul.erase(mul.begin());
	}
	return mul;
}
name zhengli(string a)//统计小数点后有几位小数
{
	int la;
	string A="";
	int point;
	if (a[0] == '0')//字符串为0.234形式A为234,小数点位数point为3
	{
		A.insert(A.begin(),a.begin() + 2,a.end());
		la = A.size();
		point = A.size();
		for (int i = la-1; i >=0; i--)
		{
			if (A[i] == '0')
			{
				A.erase(A.begin() + i);
				point--;
			}
			else
				break;
		}
	}
	else//字符串为9.4543形式,A为94543,小数点位数point为4
	{
		la = a.size();
		bool sign = false;
		for (int i = 0; i < la; i++)
		{
			if (a[i] == '.')//判断字符串里有没有小数点
			{
				a.erase(a.begin() + i);
				point = a.size() - i;
				sign = true;
				break;
			}
		}
		if (sign)//有小数点
		{
			la = a.size();
			for (int i = la - 1; i >= 0; i--)
			{
				if (a[i] == '0')//删除小数点末尾无效的0
				{
					a.erase(a.begin() + i);
					point--;
				}
				else
					break;
			}
			A = a;
		}
		else//没有小数点
		{
			A = a;
			point = 0;
		}
	}
	name result;//没有办法直接返回两个返回值,所以采用结构体形式
	result.s = A;
	result.point_num = point;
	return result;

}


int main()
{
	string a = "1.0100";
	int n = 12;
	zhengli(a);
	name re = zhengli(a);
	//cout << re.s << endl << re.point_num << endl;
	string str = re.s;
	int m = n - 1;

	while (m--)
	{
		str = multiply(str, re.s);
	}
	if (str.size()>re.point_num*n)
		str.insert(str.end() - re.point_num*n, '.');
	else
	{
		int m=re.point_num*n - str.size();
		while (m--)
			str.insert(str.begin(), '0');
		str.insert(str.begin(), '.');
		str.insert(str.begin(), '0');
	}
	cout << str;
	system("pause");
	return 0;

}


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,处理大数运算通常会利用内置的`int`类型和一些特定库,如`decimal`或`gmpy2`,它们提供了高精度计算功能。这里我会给出一些基本的大数运算代码示例: **使用内置`int`类型(适用于较小范围)**: ```python # 创建两个大数 num1 = int('12345678901234567890') num2 = int('98765432109876543210') # 加法、减法、乘法、除法 addition = num1 + num2 subtraction = num1 - num2 multiplication = num1 * num2 try: division = num1 / num2 # Python 3,注意这里可能会抛出异常 except ZeroDivisionError: division = '无法除以零' print(f"加法: {addition}, 减法: {subtraction}, 乘法: {multiplication}, 除法: {division}") ``` **使用`decimal`模块(高精度计算)**: ```python from decimal import Decimal # 设置高精度模式 getcontext().prec = 100 # 设置小数点后位数 num1 = Decimal('12345678901234567890.12345') num2 = Decimal('98765432109876543210.98765') addition = num1 + num2 subtraction = num1 - num2 multiplication = num1 * num2 # `Decimal`除法不会自动截断,结果保留所有小数位 division = num1 / num2 print(f"加法: {addition}, 减法: {subtraction}, 乘法: {multiplication}, 除法: {division}") ``` **使用第三方库`gmpy2`(更高效,适合大数值)**: ```python import gmpy2 num1 = gmpy2.mpz('12345678901234567890') num2 = gmpy2.mpz('98765432109876543210') addition = gmpy2.add(num1, num2) subtraction = gmpy2.sub(num1, num2) multiplication = gmpy2.mul(num1, num2) # `mpz`类型默认为整数,无浮点除法 # 如果需要精确除法,可以用`divexact`函数 try: division = gmpy2.divexact(num1, num2) except ZeroDivisionError: division = '无法除以零' print(f"加法: {addition}, 减法: {subtraction}, 乘法: {multiplication}, 除法: {division}") ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值