如何实现超大数字的运算啊?

追寻梦中人 2005-08-08 09:29:33
比如说两个100位的整数的相乘,
这个怎么实现的啊?
...全文
663 23 打赏 收藏 转发到动态 举报
写回复
用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)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧