回 帖 发 新 帖 刷新版面

主题:用C++来设计超大数的精确运算,在类内来实现

用C++来设计超大数的精确运算,在类内来实现,
实现+,-,*最好还有/.
+,-要求有小数,没有也可以.
如果哪为仁兄知道或者有程序请帮帮忙.
谢谢了!!! [em10]

回复列表 (共7个回复)

沙发

超大是多大,

板凳

越大越好
希望哪位朋友帮帮忙!!!帮我度过难关!
老师说最好能达到+.-20亿,不能达到也没有关系,只要大家能帮我的忙我在这里就非常感谢了,
谢谢各位朋友了!

3 楼

32位加法:
#include "string.h"
#include "mem.h"
#include "stdio.h"
main()
{
    char a[33],b[33],result[34],Temp[33];
    int alen,blen,len,flag=0,t;
    int i;
    printf("Please input the first number:");
    gets(a);
    a[strlen(a)]=0;
    alen=strlen(a);
    printf("Please input the second number:");
    gets(b);
    b[strlen(b)]=0;
    blen=strlen(b);
    memset(Temp,0,33);
    strcpy(Temp,a);
    for (i=0;i<alen;i++)
    {
        a[i]=Temp[alen-i-1];
    }
        memset(Temp,0,33);
    strcpy(Temp,b);
    for (i=0;i<blen;i++)
    {
        b[i]=Temp[blen-i-1];
    }
    len=alen>blen? alen:blen;
    if (alen>blen)
    {
        memset(b+blen,'0',alen-blen);
    }
    else
    {
        memset(a+alen,'0',blen-alen);
    }
    memset(result,0,strlen(result));
    for (i=0;i<len;i++)
    {
        t=a[i]+b[i]-'0'-'0'+flag;
        if (t<10)
            flag=0;
        else
        {
            flag=t%10;
            flag=(t-flag)%10;
            t=t%10;
        }
        result[i]=t+'0';
    }
    if (flag) result[i++]=flag;
    memset(Temp,0,34);
    strcpy(Temp,result);
    for (i=0;i<strlen(result);i++)
    {
        result[i]=Temp[strlen(result)-i-1];
    }
    i=0;
    while(result[i]=='0')
    {
        i++;
    }
    printf("%s",&result[i]);
}



4 楼

32位加法:
#include "string.h"
#include "mem.h"
#include "stdio.h"
main()
{
    char a[33],b[33],result[34],Temp[33];
    int alen,blen,len,flag=0,t;
    int i;
    printf("Please input the first number:");
    gets(a);
    a[strlen(a)]=0;
    alen=strlen(a);
    printf("Please input the second number:");
    gets(b);
    b[strlen(b)]=0;
    blen=strlen(b);
    memset(Temp,0,33);
    strcpy(Temp,a);
    for (i=0;i<alen;i++)
    {
        a[i]=Temp[alen-i-1];
    }
        memset(Temp,0,33);
    strcpy(Temp,b);
    for (i=0;i<blen;i++)
    {
        b[i]=Temp[blen-i-1];
    }
    len=alen>blen? alen:blen;
    if (alen>blen)
    {
        memset(b+blen,'0',alen-blen);
    }
    else
    {
        memset(a+alen,'0',blen-alen);
    }
    memset(result,0,strlen(result));
    for (i=0;i<len;i++)
    {
        t=a[i]+b[i]-'0'-'0'+flag;
        if (t<10)
            flag=0;
        else
        {
            flag=t%10;
            flag=(t-flag)%10;
            t=t%10;
        }
        result[i]=t+'0';
    }
    if (flag) result[i++]=flag;
    memset(Temp,0,34);
    strcpy(Temp,result);
    for (i=0;i<strlen(result);i++)
    {
        result[i]=Temp[strlen(result)-i-1];
    }
    i=0;
    while(result[i]=='0')
    {
        i++;
    }
    printf("%s",&result[i]);
}



5 楼

小弟菜蔬只编了个任意位的加法
只要修改数组长度就可以了哦
时间不是问题
但是我在ACM上去通不过,小弟求跟好的算法阿,最好有乘法和除法

#include <string.h>
#include <stdio.h>
#include <time.h>

    
void reverse(char d[],int len)
{
    
    char t,*p1,*p2;
    for(p1=d,p2=&d[len-1];p1<p2;p1++,p2--)
    {
        t=*p1;
        *p1=*p2;
        *p2=t;
    }
}
main()
{
    char s1[1000],s2[1000],s3[1000];int lenmax,len1,len2;int t=0,i,j;time_t time1,time2;
    while(1)
    {
    
    scanf("%s",&s1);
    scanf("%s",&s2);
    len1=strlen(s1);
    len2=strlen(s2);
    memset(s3,0,sizeof(s3));    
    for(i=0;i<len1;i++)
        s1[i]=s1[i]-'0';
    for(i=0;i<len2;i++)
        s2[i]=s2[i]-'0';
    if(len1>len2)
    {for(i=len2;i<len1;i++)
        s2[i]=0;
    }
    else
    {for(i=len1;i<len2;i++)
        s1[i]=0;
    }
    reverse(s1,len1);
    reverse(s2,len2);    
    lenmax=(len1>len2)?len1:len2;
    j=lenmax;
    time1=time(NULL);
    for(i=0;i<j;i++)
    {
        s3[i]=s1[i]+s2[i]+t;
        t=s3[i]/10;
        if(s3[i]>=10&&i!=(lenmax-1))
            s3[i]=s3[i]%10;
        else
        {if(i==(lenmax-1)&&s3[i]>=10)
            {
                j=lenmax+1;
                s3[lenmax]=(s3[i]/10);
                
            }
            else
                j=lenmax;
        }
    }
    reverse(s3,j);    
    for(i=0;i<j;i++)
        printf("%d",s3[i]);
    printf("\n");
    time2=time(NULL);
    printf("the operation took %f!\n",difftime(time2,time1));
    }
    return 0;
}

6 楼

2楼的 你的程序我大致懂了
我问一下:

为什么 要
   flag=t%10;
            flag=(t-flag)%10;
            t=t%10;
而不是   flag=t%10;
      t=t-flag*10;
小弟愚昧,还请多多指教!!

7 楼

还有 为什么要把字符串a倒过来呢??

我来回复

您尚未登录,请登录后再回复。点此登录或注册