字符串模拟大数运算

大数加法

写的有些复杂----,不过是对的

#include
#include
using namespace std;
char a[200];
char b[200];
char c[200];
int i;
int add_fun()
{
    int a_length,b_length;
    int j;
    for(i=0;;i++)
    {
        if(a[i]=='\0')
        break;      
    }
    a_length=i;
        for(i=0;;i++)
    {
        if(b[i]=='\0')
        break;  
    }
    b_length=i;
    int n,m;
    int jinwei=0;
    for(n=a_length-1,m=b_length-1,i=0;n>=0&&m>=0;n--,m--,i++)
    {
        if(a[n]+b[m]+jinwei-'0'-'0'>9)
        {
            c[i]=a[n]-'0'+b[m]-10+jinwei;
            jinwei=1;
        }
        else
        {
            c[i]=a[n]-'0'+b[m]+jinwei;
            jinwei=0;
        }
    }
    if(n<0&&m<0)
    {
        if(jinwei==1)
        {
            c[i]='1';
            i++;
        }
        return 1;
    }
    if(n<0&&m>=0)
    {
        for(m;m>=0;m--)
        {
            if(b[m]+jinwei-'0'>9)
            {
                c[i]=b[m]+jinwei-10;
                jinwei=1;
            }
            else
            {
                c[i]=b[m]+jinwei;
                jinwei=0;
            }
            i++;
        }
        return 1;
    }
    if(n>=0&&m<0)
    {
        for(n;n>=0;n--)
        {
            if(a[n]+jinwei-'0'>9)
            {
                c[i]=a[n]+jinwei-10;
                jinwei=1;
            }
            else
            {
                c[i]=a[n]+jinwei;
                jinwei=0;
            }
            i++;
        }
        return 1;
    }
    return 1;
}
int main()
{
    cin>>a>>b;
    add_fun();
    for(int j=i-1;j>=0;j--)
    {
    cout<

简易版本

#include
#include
#include
using namespace std;
int  main()
{
    char s1[200],s2[200];
    int num1[200]={0},num2[200]={0},len1,len2,i,j;            //数组清零

    cin>>s1>>s2;                                         //输入两个大数装入字符数组

    len1=strlen(s1);
    len2=strlen(s2);                                    //获得大数的长度

    for(i=len1-1,j=0;i>=0;i--)
        num1[j++]=s1[i]-'0';
    for(i=len2-1,j=0;i>=0;i--)
        num2[j++]=s2[i]-'0';                           //将字符数组的值转为整形数值并装入数组


    for(i=0;i<200;i++)
    {
        num1[i]+=num2[i];
        if(num1[i]>9)
        {
            num1[i]=num1[i]-10;
            num1[i+1]++;
        }
    }                                               //两个数组按位相加

    for(i=199;(i>=0)&&(num1[i]==0);i--);                  //从高位找出第一个不是零的数
        if(i>=0)
            for(;i>=0;i--)
                printf("%d",num1[i]);                 //输出数组
            else
                printf("0\n");
return 0;
}

大数减法

有bug啊啊啊啊,只能两个正整数相减,且被减数小于减数

#include
#include
#include
using namespace std;
int  main()
{
    char s1[200],s2[200];
    int num1[200]={0},num2[200]={0},len1,len2,i,j;            //数组清零

    cin>>s1>>s2;                                         //输入两个大数装入字符数组

    len1=strlen(s1);
    len2=strlen(s2);                                    //获得大数的长度

    for(i=len1-1,j=0;i>=0;i--)
        num1[j++]=s1[i]-'0';//从左到右,位数越高 
    for(i=len2-1,j=0;i>=0;i--)
        num2[j++]=s2[i]-'0';                           //将字符数组的值转为整形数值并装入数组

 int jiewei=0; 
    for(i=0;i<200;i++)
    {
        num1[i]-=num2[i];
        if(num1[i]<0)
        {
            num1[i]=num1[i]+10;
            num1[i+1]--;
        }
    }                                    //两个数组按位相减 

    for(i=199;(i>=0)&&(num1[i]==0);i--); //从高位找出第一个不是零的数
        if(i>=0)
            for(;i>=0;i--)
                printf("%d",num1[i]);    //输出数组
            else
                printf("0\n");
return 0;
}

大数乘法

这个也写了好久,越来越垃圾了,细节啊,细节。有时候图快,直接复制粘贴一些代码,呵呵,这次又是全局变量惹得祸,还有 没有申请临时变量。
嘤嘤,好伤心啊,又变垃圾了

#include
#include
#include
using namespace std;
char s1[200],s2[200];
int num1[200]={0},num2[200]={0},len1,len2,i,j,sum[200]={0},jiashu[200]={0};//数组清零
void fun1()//两个数相加,没有错 
{
        for(int ii=0;ii<200;ii++)
    {
        sum[ii]+=jiashu[ii];
        if(sum[ii]>9)
        {
            sum[ii]=sum[ii]-10;
            sum[ii+1]++;
        }
    }
 } 
void fun2(int a,int n)//一位数相乘 ,a为一位数 
{
    memset(jiashu,0,sizeof(jiashu)); 
    for(int ii=0;ii<200;ii++)//一位数乘法,没有错 
    {
        jiashu[ii]+=a*num1[ii];
        //cout<<"a num1[ii]"<9)
        {
            int temp=jiashu[ii];
            jiashu[ii]=jiashu[ii]%10;
            //cout<<"jiashu[ii]"<<" "<=0;ii--)//向后移几位 
    {
       jiashu[ii+n]=jiashu[ii];
    }
    for(int ii=0;ii>s1>>s2;                                  //输入两个大数装入字符数组
    len1=strlen(s1);
    len2=strlen(s2);                             //获得大数的长度

    for(i=len1-1,j=0;i>=0;i--)
        num1[j++]=s1[i]-'0';
    for(i=len2-1,j=0;i>=0;i--)
    num2[j++]=s2[i]-'0';                     //将字符数组的值转为整形数值并装入数组
    fun2(num2[0],0); 
    for(i=1;i=0)&&(sum[i]==0);i--);          //从高位找出第一个不是零的数
        if(i>=0)
            for(;i>=0;i--)
                printf("%d",sum[i]);             //输出数组
            else
                printf("0\n");
return 0;
}

大数除法

这个没加小数点,求精度可以用这个方法哟。刚刚以为是正确的,试了一个整除的例子,死循环了,又改了一下。

#include
#include
#include
using namespace std;
char s1[200],s2[200];
int num1[200]={0},num2[200]={0},len1,len2,i,j,result[200]={0},jiashu[200]={0};//数组清零
int result_n=0;
int flag=0;
int cmp(int *y)
{
    int ii,jj;
    for(ii=199;num2[ii]==0;ii--);//找到最高位的位置
    for(jj=199;y[jj]==0;jj--);//找到最高位的位置
    if(ii>jj)
    {
        return 1;//x的位数多说明x大 
    }
    if(ii=0;jj--)
    {
        if(num2[jj]>y[jj])
        {
            return 1;
        }
        if(num2[jj]0){
        //扩大10倍 
        for(int ii=198;ii>=0;ii--)
        {
         y[ii+1]=y[ii];
        } 
        y[0]=0;
        //result[result_n++]=0;
    } 
    int yy[200];
    for(int ii=0;ii<200;ii++)
    {
        yy[ii]=y[ii];
    } 
    int shang=0;
    while(cmp(yy)<=0)
    {
        if(cmp(yy)==0)
        flag=1;
         shang++;
         subtract(yy);
    } 
    for(int ii=0;ii<200;ii++)//余数给num1 
    {
        num1[ii]=yy[ii];
    }
    result[result_n++]=shang;
} 
int  main()
{
    cin>>s1>>s2;                                  //输入两个大数装入字符数组
    len1=strlen(s1);
    len2=strlen(s2);  
    memset(num1,0,sizeof(num1));
    memset(num2,0,sizeof(num2));                           //获得大数的长度
    for(i=len1-1,j=0;i>=0;i--)
    num1[j++]=s1[i]-'0';
    for(i=len2-1,j=0;i>=0;i--)
    num2[j++]=s2[i]-'0';  
    for(i=0;i<100&&flag==0;i++)
    {
        division();
    }                       //将字符数组的值转为整形数值并装入数组                                            //两个数组按位相加
    for(i=0;i<100;i++)
    {
        printf("%d",result[i]); 
    }  
return 0;
}

大数开方,取整数部分

思路 一个 位数为 2n 的数 的根号 位数为 n;
一个 位数为(2n+1)的数 的根号 位数为 n+1;
然后就从高位开始一位一位的试,直到试到个位就可以了

模拟手算,结合上面的乘法 就能做出了,看到了一个高级解法,以后补上


大数除法

#include 
#include 
#include 


using namespace std;

char s[10000005];
int main()
{
    long long a = 73;
    long long b = 137;
    long long i = 1;
    while(~scanf("%s",s)){
        getchar();
        int len = strlen(s);
        long long ans = 0;
        long long ans1 = 0;
        for(int i = 0; i < len; ++i)
        {
           ans = ans*10 + (s[i]-'0');
           ans %= a;
        }
        for(int i = 0; i < len; ++i)
        {
           ans1 = ans1*10 + (s[i]-'0');
           ans1 %= b;
        }
        if(ans==0&&ans1==0){
            printf("Case #%lld: YES\n",i++);
        }else{
            printf("Case #%lld: NO\n",i++);
        }
    }
    return 0;
}

你可能感兴趣的:(字符串模拟大数运算)