社区
数据结构与算法
帖子详情
如何实现超大数字的运算啊?
追寻梦中人
2005-08-08 09:29:33
比如说两个100位的整数的相乘,
这个怎么实现的啊?
...全文
663
23
打赏
收藏
如何实现超大数字的运算啊?
比如说两个100位的整数的相乘, 这个怎么实现的啊?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
23 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
i33333
2005-09-24
打赏
举报
回复
mark
bingbox_1984
2005-09-23
打赏
举报
回复
个人建议用数组,数组的每个元素存储位值
Chrisma
2005-09-23
打赏
举报
回复
到maguangzhi.bokee.com去下吧,现成的习题解答
无心人
2005-09-09
打赏
举报
回复
http://yaojialin.51.net/download/Number.rar
未完成,但是核心算法有
Fxxxyshh
2005-09-03
打赏
举报
回复
#include <iostream>
#include <cstring>
#include <string>
#include <cassert>
#include <cstdlib>
typedef int ET;
typedef struct NODE{
ET data;
struct NODE * p;
struct NODE * n;
}NODE,*NODEH;
typedef struct LIST{
NODEH head;
NODEH end;
int length;
}LIST,*LISTH;
////////////////////////
////////////////////////
inline bool InitList(LISTH& L)
{
//将头结点L处理一下
L=(LISTH)malloc(sizeof(LIST));
assert(L);
L->head = L->end = NULL;
L->length=0;
return true;
}
inline NODEH NMalloc(const ET& elem)
{
//返回一个新结点,其数据为elem
NODEH temp=(NODEH)malloc(sizeof(NODE));
assert(temp);
temp->data=elem;
return temp;
}
inline bool PreAdd(LISTH& L,const ET& elem)
{
//在头部加入新结点elem
NODEH temp=NMalloc(elem);
++(L->length);
if(NULL==L->head&&NULL==L->end){
temp->n=temp->p=NULL;
L->head=L->end=temp;
return true;
}
temp->p= NULL;
temp->n= L->head;
L->head->p=temp;
L->head= temp;
return true;
}
inline bool EndAdd(LISTH& L,const ET& elem)
{
//在尾部加入新结点elem
NODEH temp=NMalloc(elem);
++(L->length);
if(NULL==L->head&&NULL==L->end){
temp->n=temp->p=NULL;
L->head=L->end=temp;
return true;
}
temp->n=NULL;
temp->p=L->end;
L->end->n=temp;
L->end=temp;
return true;
}
inline bool DestoryList(LISTH& L)
{
//将表L 释放
NODEH temp=L->head,it;
if(temp==NULL){
free(L);
return true;
}
while(temp!=L->end){
it=temp;
temp=temp->n;
free(it);
}
free(temp);
free(L);
return true;
}
inline void PrintList(LISTH& L)
{
//print
NODEH it=L->head,end=L->end;
if(it==NULL)return;
for(;it!=end;it=it->n)
putchar(it->data+'0');
putchar(it->data+'0');
}
inline bool AddZero(LISTH& L,int count)
{
//在L的尾部加上count个0
while(count--)EndAdd(L,0);
return true;
}
inline bool BitMul(LISTH& L,const int number,LISTH& NUM)
{
//将L与数number相乘 后的结果存入NUM中去
//NUM应当为空表结构!!!!!!!!!
NODEH L_end=L->end;
int status=0,temp;
for(; L_end!=L->head ;L_end=L_end->p){
temp= L_end->data * number + status;
PreAdd(NUM, temp%10 );
status= temp/10;
}
temp= L->head->data * number + status;
if(temp>10){
PreAdd(NUM,temp%10 );
PreAdd(NUM,temp/10);
}
else PreAdd(NUM,temp);
//少一次哦:)
return true;
}
inline bool ADD(const LISTH& La,LISTH& Lb)
{
// Lb= La+Lb
NODEH pa=La->end,pb=Lb->end;
int status=0;
for(;pa!= La->head;pa=pa->p,pb=pb->p){
if(pb==NULL){
PreAdd(Lb,0);
pb=Lb->head;
}
int sum=pa->data+pb->data+status;
if(sum>=10){
pb->data=sum%10;
status=1;
}
else{
pb->data=sum;
status=0;
}
}
if(pb==NULL){
PreAdd(Lb,0);
pb=Lb->head;
}
int sum= pa->data + pb->data +status;
if( sum>=10){
pb->data=sum%10;
if(pb->p ==NULL){
PreAdd(Lb,0);
pb=Lb->head;
pb->data=sum/10;
return true;
}
pb=pb->p;
if(pb==NULL){
PreAdd(Lb,0);
pb=Lb->head;
}
pb->data=sum/10;
return true;
}
else //sum<10
pb->data=sum;
return true;
}
///////////////////////////////////////////////////////////////////////////////
inline void MUL(const char * a,const char *b)
{
//init
LISTH CS=NULL; //乘数
LISTH BCS=NULL; //被乘数
LISTH NUM=NULL; //结果
assert(a&&b);
assert(InitList(NUM));
assert(InitList(CS)&&InitList(BCS));
{
//符号处理
int sig=1;
if('-'==*a){
++a;
sig*=-1;
}
else if('+'==*a) ++a;
if('-'==*b){
++b;
sig*=-1;
}
else if('+'==*b)++b;
if(sig<0)putchar('-');
}
if(strcmp(a,b)>0){
const char *pa= a,*pb=b;
for(;'\0'!=*pa;++pa){
int temp= *pa-'0';
assert(EndAdd(BCS,temp) );
}
for(;'\0'!=*pb;++pb){
int temp= *pb-'0';
assert(EndAdd(CS,temp) );
}
}
else {
const char *pa= a,*pb=b;
for(;'\0'!=*pa;++pa){
int temp= *pa-'0';
assert(EndAdd(CS,temp) );
}
for(;'\0'!=*pb;++pb){
int temp= *pb-'0';
assert(EndAdd(BCS,temp) );
}
}
// init end!!!!
NODEH cs_p= CS->end;
int bit = 0;//位数
for(; cs_p !=CS->head ; cs_p=cs_p->p){
LISTH TEMP;
InitList(TEMP);
BitMul(BCS,cs_p->data,TEMP);
///////////////////////////////////////////////////////////////////////
puts("===============================================================\n");
PrintList(BCS);///////////////////////////////////////////////
printf(" X %d=",cs_p->data);
PrintList(TEMP);
///////////////////////////////////////////////////////////////////////
//<============================== here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
AddZero(TEMP,bit);
ADD(TEMP,NUM);
/////////////////
puts("\nNUM:");
PrintList(NUM);
printf("\nbit:%d\n",bit);
////////////////////////////////////////////////////////////////////
++bit;
DestoryList(TEMP);
}
LISTH TEMP;
InitList(TEMP);
BitMul(BCS,cs_p->data,TEMP);
///////////////////////////////////////////////////////////////////////
puts("===============================================================\n");
PrintList(BCS);///////////////////////////////////////////////
printf(" X %d=",cs_p->data);
PrintList(TEMP);
///////////////////////////////////////////////////////////////////////
//<============================== here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
AddZero(TEMP,bit);
ADD(TEMP,NUM);
/////////////////
puts("\nNUM:");
PrintList(NUM);
printf("\nbit:%d\n",bit);
////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
std::cout<<'\n'<<"结果=";
PrintList(NUM);
putchar('\n');
///////////清理工作
DestoryList(TEMP);
DestoryList(BCS);
DestoryList(CS);
DestoryList(NUM);
}
int main(void)
{
std::string a,b;
std::cin>>a;
std::cin>>b;
MUL(a.c_str(),b.c_str());
system("pause");
return 0;
}
追寻梦中人
2005-09-03
打赏
举报
回复
怎么找您写的这些贴子啊?
无心人
2005-09-01
打赏
举报
回复
看规模
大数用成熟的软件包
GMP合适,但编译复杂,不过在Linux上比较容易
小数(小于10000比特)自己写
我在这个论坛有一系列帖子,除了除法没做,别的都写了
captainivy
2005-08-27
打赏
举报
回复
用分治法可实现。
google一下。
mathe
2005-08-22
打赏
举报
回复
http://www.swox.com/gmp/
onefreeboy
2005-08-21
打赏
举报
回复
我也没找到啊。。。
lazygod
2005-08-21
打赏
举报
回复
ssl源代码里有
追寻梦中人
2005-08-20
打赏
举报
回复
GMP包?搜了一下好象没有啊
追寻梦中人
2005-08-10
打赏
举报
回复
如果不知道里面的算法是怎么回事,那源码也根本看不懂啊。。。
SAsura
2005-08-10
打赏
举报
回复
这个东西怎么天天见,怎么总有人问啊~~
mathe
2005-08-10
打赏
举报
回复
GMP所有源代码都是公开的,你下载源代码都可以.
不过里面使用的算法很复杂:)
xiaocai0001
2005-08-10
打赏
举报
回复
哎,就是自己编写数据结构,模拟小学时你学数学时的加减乘除的过程来计算的!
Kvci
2005-08-09
打赏
举报
回复
有个苯点的思路:
把大数字存在一个大的整形数组里,其中a[0]记录该大数的位数,其余的为对应位置的数字。
再写两几个函数
(1)写个可以把按以上格式存储的大数相加的函数
(2)再写个大数乘一位数的函数。(两个函数应该不难写)
然后你就可以弄3个数组,两个101位的,保存被乘数和乘数,
再一个200位的保存结果。
先把结果置0,再把乘数逐个分开乘被乘数的结果累加到长度为200的数组里
quicksoftxyz
2005-08-09
打赏
举报
回复
数论上介绍一种处理方法:
中国剩余定理
用余数来表示一个大整数,具体的请参考相关知识。
如果有收获就对了
追寻梦中人
2005-08-09
打赏
举报
回复
哦,GMP里面是怎么实现的啊?
mathe
2005-08-09
打赏
举报
回复
建议用一些现成的软件包,比如GMP,通过google查找GMP就可以了. 可以在Windows也可以在Linux上使用
加载更多回复(3)
计算机原理(2)电路如何
实现
逻辑
运算
,芯片内部是如何
实现
加法
运算
?
你们有没有这样的疑问:为什么计算机内部进行二进制
运算
,而不是十进制
运算
? 为解决这个问题,我们先来说说计算机内部是如何
实现
二进制
运算
的。 首先先说说常见的逻辑
运算
,假设我们有两个数A、B,取值范围:0 或...
算法 | 如何用位
运算
实现
加减
运算
?
本文主要介绍如何使用位
运算
来
实现
加减功能,也就是在整个
运算
过程中不能出现加减符号。加减乘除
运算
在计算机中,实际上都是用位
运算
实现
的,今天就用位
运算
来模拟下加法和减法的
运算
功能。本文主要介绍如何使用位...
js
实现
超大
数字
的加减乘除
网上没发现
超大
数字
运算
的js
实现
,标题有,但是并不是真正的
超大
数
运算
,而且有很多乘法加法都不精确的拿出来坑人。我自己
实现
了一版,性能还不错,支持数百万长度的精确
数字
运算
,测试乘法10万长度在1分钟内完成,...
如何用C语言
实现
超大
整数(不大于10^1000)的加减
运算
如何用C语言
实现
超大
整数(不大于101000)的加减
运算
由于C语言的整型数据储存机制,要想用C语言
实现
超大
整数的加减
运算
可不像下面这么简单 int main() { long long int a,b; scanf("%d %d",&a,&b); printf...
C语言大
数字
运算
什么是大
数字
运算
?一般的C语言数据类型,如float,double,总是有数值范围的,不可能无限大。就算float这样的数据类型,可表示的数据范围已经很大了,可是它的小数点精度也非常有限,算出来的结果总是不太准确。于是...
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章