首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

[C/C++/C语言]设计一种构造能表示最多1000位的大整数(正、负均可),并实现这类数的乘运算

2012-10-15 
[C/C++/C语言]设计一种结构能表示最多1000位的大整数(正、负均可),并实现这类数的乘运算。用c做[解决办法]C/

[C/C++/C语言]设计一种结构能表示最多1000位的大整数(正、负均可),并实现这类数的乘运算。
用c做

[解决办法]

C/C++ code
/*    最笨的最原始的人类思想法       用第二个数的每一个位乘第一个数   得到的数据屁股不足零然后累加   下面的数据你想算100万位都可以,只要你的计算机内存够大   第一个数表示+或-,0表示+,1表示-*/#include "stdio.h"#include "stdlib.h"typedef struct MYNUMBER{    char   value;    struct MYNUMBER *next;    struct MYNUMBER *prev;}*BIGNUMBER;BIGNUMBER Mul(BIGNUMBER n1,BIGNUMBER n2);               /*两数相乘*/BIGNUMBER GetVal(char *str);                            /*用字串转换成大数*/void      DelVal(BIGNUMBER n);                          /*删除大数占用内存*/void      ShowVal(BIGNUMBER n);                         /*显示大数*/void      InitVal(BIGNUMBER n);                         /*大数置0*/void      Mulx(BIGNUMBER r,BIGNUMBER n,char d,int off); /*用大数n乘一个数d,屁股补off个0,结果给大数r*/void      Addx(BIGNUMBER r,BIGNUMBER n);                /*用大数r加大数n,结果给大数r*/void main(){    BIGNUMBER x1,x2,y;    x1=GetVal("-939874523423798462436234\0");    x2=GetVal("9873423624623462345235234\0");    y=Mul(x1,x2);    ShowVal(x1);    ShowVal(x2);    ShowVal(y);        DelVal(x1);    DelVal(x2);    DelVal(y);}BIGNUMBER GetVal(char *str){    char *ch;    BIGNUMBER Head;    BIGNUMBER Cur;    Head=(BIGNUMBER)malloc(sizeof(MYNUMBER));    Head->value=-1;    Head->next=NULL;    Head->prev=NULL;    Cur=Head;    if(str)    {        ch=str;        if(*ch=='-')         {            Head->value=1;            ch++;        }        else Head->value=0;        while(*ch)        {            BIGNUMBER p=(BIGNUMBER)malloc(sizeof(MYNUMBER));            p->value=*ch-0x30;            p->next=NULL;            Cur->next=p;            p->prev=Cur;            Cur=Cur->next;            ch++;        }    }    return Head;}void DelVal(BIGNUMBER n){    BIGNUMBER tmp1,tmp2;    tmp1=tmp2=n;    while(tmp2)    {        tmp2=tmp2->next;        free(tmp1);        tmp1=tmp2;    }}void ShowVal(BIGNUMBER n){    BIGNUMBER tmp=n;    printf("\n");    if(tmp->value==-1)    {        printf("Error Number\n");        return;    }    if(tmp->value==1) printf("-");    tmp=tmp->next;    while(tmp)    {        printf("%d",tmp->value);        tmp=tmp->next;    }    printf("\n");}void InitVal(BIGNUMBER n){    BIGNUMBER tmp=n->next;    while(tmp)    {        tmp->value=0;        tmp=tmp->next;    }}void Mulx(BIGNUMBER r,BIGNUMBER n,char d,int off){    BIGNUMBER Tail1,Tail2;    char kk=0,tmp=0;    int  i;    Tail1=r;    while(Tail1->next)        Tail1=Tail1->next;    for(i=0;i<off;i++)        Tail1=Tail1->prev;    Tail2=n;    while(Tail2->next)        Tail2=Tail2->next;    while(Tail2!=n)    {        tmp=Tail2->value*d+kk;        Tail1->value=tmp%10;        kk=tmp/10;        Tail2=Tail2->prev;        Tail1=Tail1->prev;    }    Tail1->value=kk;}void  Addx(BIGNUMBER r,BIGNUMBER n){    BIGNUMBER Tail1,Tail2;    char kk=0,tmp=0;    Tail1=r;    while(Tail1->next)        Tail1=Tail1->next;    Tail2=n;    while(Tail2->next)        Tail2=Tail2->next;    while(Tail2!=n)    {        tmp=Tail1->value+Tail2->value+kk;        Tail1->value=tmp%10;        kk=tmp/10;        Tail2=Tail2->prev;        Tail1=Tail1->prev;    }    if(Tail1!=r) Tail1->value=kk;}BIGNUMBER Mul(BIGNUMBER n1,BIGNUMBER n2){    BIGNUMBER Head1,Head2;    BIGNUMBER Tail,Cur,tmp;    int len1=0,len2=0,len3=0;    int i;    int kk=0,off=0;    Head1=(BIGNUMBER)malloc(sizeof(MYNUMBER));    Head1->next=NULL;    Head1->prev=NULL;    if((n1->value==-1)||(n2->value==-1))         Head1->value=-1;    else     {        Head1->value=n1->value^n2->value;        printf("\nAAAAA: %d",Head1->value);        Tail=n1;        while(Tail->next)        {            len1++;            Tail=Tail->next;        }        Tail=n2;        while(Tail->next)        {            len2++;            Tail=Tail->next;        }        len3=len1+len2+2;                Head2=(BIGNUMBER)malloc(sizeof(MYNUMBER));        Head2->value=0;        Head2->prev=NULL;        Head2->next=NULL;        Cur=Head1;        for(i=0;i<len3;i++)        {            BIGNUMBER p=(BIGNUMBER)malloc(sizeof(MYNUMBER));            p->value=0;            p->next=NULL;            Cur->next=p;            p->prev=Cur;            Cur=Cur->next;        }        Cur=Head2;        for(i=0;i<len3;i++)        {            BIGNUMBER q=(BIGNUMBER)malloc(sizeof(MYNUMBER));            q->value=0;            q->next=NULL;            Cur->next=q;            q->prev=Cur;            Cur=Cur->next;        }           Cur=Tail;        off=0;        while(Cur!=n2)        {            InitVal(Head2);            Mulx(Head2,n1,Cur->value,off);            Addx(Head1,Head2);            Cur=Cur->prev;            off++;        }                Cur=Head1->next;        while(Cur->value==0)        {            tmp=Cur;            Cur=Cur->next;            tmp->next->prev=tmp->prev;            tmp->prev->next=tmp->next;            free(tmp);        }        Cur=Head2;        while(Cur)        {            Cur=Cur->next;            free(Head2);            Head2=Cur;        }    }    return Head1;} 


[解决办法]
请参考:
大数的四则运算及求模

大数的加减乘除和求模都是用C写的,你算多少位都不会有问题。
[解决办法]
C的来了。

C/C++ code
#include <stdio.h>#include <string.h>#include <memory.h>#define MAX_LENGTH 1000typedef struct{    int m_sign;    int m_len;    char m_num[MAX_LENGTH];}BIG_NUMBER;BIG_NUMBER m_num;BIG_NUMBER BigNumberMultiply(BIG_NUMBER left, BIG_NUMBER R){    BIG_NUMBER Result;    int i=1,        j=1,        carry=0;    char *muti1,*muti2,*result=Result.m_num;    int len1,len2;    memset(result,0,MAX_LENGTH);    Result.m_sign=left.m_sign * R.m_sign;    muti1=left.m_num;    muti2=R.m_num;    len1=left.m_len;    len2=R.m_len;    for (i=len2-1;i>=0;i--)    {        for(j=len1-1;j>=0;j--)        {            result[(len2-1-i)+(len1-1-j)] += (muti1[j]-0x30)*(muti2[i]-0x30)+carry;            carry=result[(len2-1-i)+(len1-1-j)] / 10;            result[(len2-1-i)+(len1-1-j)] %= 10;        }        result[(len2-1-i)+(len1-1-j)]+=carry;        carry=0;    }    result[(len2-1-i)+(len1-1-j)]+=carry;    for(i=0; i<len1+len2;i++)    {        result[i]+=0x30;    }    strcpy(Result.m_num,_strrev(result));    Result.m_len=strlen(Result.m_num);    return Result;}int main(void){    BIG_NUMBER left,right,result;    left.m_len=9;    left.m_sign=1;    memset(left.m_num,0,MAX_LENGTH);    right.m_len=9;    right.m_sign=1;    memset(right.m_num,0,MAX_LENGTH);    strcpy(left.m_num,"999999999");    strcpy(right.m_num,"999999999");    result=BigNumberMultiply(left,right);    printf("The result is %s\n",result.m_num);    return 0;} 

热点排行