HDOJ1042 大数*小数

博客内容介绍了如何解决大数乘小数的问题,重点在于提供了一种高效的方法,避免了将大数和小数都作为字符串处理导致的时间复杂度过高的情况。通过将小数视为整体,遍历大数的每一位进行乘法运算并累加进位,实现了时间复杂度的降低,从而避免了超时。文中给出了具体的算法思路和HDOJ1042题目的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目很简单,就是输入一个N,求N的阶乘。

这个题目是一个大数乘小数的问题,例如N! =(N-1)! * N,这里,(N-1)!为大数,表示为字符串的形式,N为小数,表示为int的形式。这道题的重点就是写一个函数实现一个大数乘小数。

一开始我的做法是大数和小数全部作为字符串处理,类似于小学时的基本的竖式乘法来计算,这样的话时间复杂度会非常高,设大数有x位数字,小数有y位数,需要有xy次访问,并且每次还需要进行一次大数加法运算,时间复杂度实在太高,代码提交上去肯定会超时的。

大数×小数的基本思想是:我们小学时候的乘法竖式运算将每个数都一位一位的进行乘法运算,这里我们将小数看成一个整体。例如7231(大数,表示为字符串)×39(小数),设置一个变量carry表示进位。result字符串表示结果,初始化为空串

carry=0,遍历大数的每一位:

1×39+carry=39   carry=39/10=3   39%10=9,result='9'+result=9

3×39+carry=120  carry=120/10=12  120%10=0   result='0'+result=09

2×39+carry=90   carry=9   result=009

7×39+carry=282   carry=28   result=2009

此时大数的每一位遍历完成,carry=28,result="28"+result=282009得到结果。

附上HDOJ1042的代码,BigInt类封装了大整数

#include<iostream>
#include<cstdio>
using namespace std;
//#define DEBUG
void calFactorial(int N);
string intToString(i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值