您的位置:首页 > 其它

高精度算法

2014-09-27 22:27 399 查看
高精度加法:

#include <iostream>

#include <string.h> 

using namespace std;

int main()

{

    char a[1001],b[1001];

    int la,lb,i;

    int x[1001]={0},y[1001]={0},he[1002]={0};

    int t=0;

    cin>>a>>b;

    la=strlen(a);

    lb=strlen(b);

    for (i=0;i<la;i++) x[la-i-1]=(int)a[i]-48;

    for (i=0;i<lb;i++) y[lb-i-1]=(int)b[i]-48;

    

    for (i=0;i<1001;i++)

    {

        t=x[i]+y[i]+he[i];

        if (t<10) he[i]=t;

        else

        {

            he[i+1]++;

            he[i]=t-10;

        }

    }

    for (i=1000;i>=0;i--) if (he[i]!=0) break;

    for (i=i;i>=0;i--) cout<<he[i];

    cout<<endl;

    system("pause");

    return 0;

}

高精度减法:

#include <iostream>

#include <math.h>

#include <string.h>

using namespace std;

char a[1001],b[1001],t[1001];

int main()

{

    

    int x[1001]={0},y[1001]={0},s[1002]={0};

    cin>>a>>b;

    int i,j,la,temp,lb;

    bool flag=false;

    la=strlen(a);lb=strlen(b);

    if (la<lb)

    {

        strcpy(t,a);

        strcpy(a,b);

        strcpy(b,t);

        flag=true;

    }

    else if (la==lb && strcmp(a,b)==-1)

         {

             strcpy(t,a);

             strcpy(a,b);

             strcpy(b,t);

             flag=true;

         }

    //如何逆序,并转换为数值 

    for(i=0;i<la;i++)x[la-i-1]=(int)a[i]-48; 

    for(i=0;i<lb;i++)y[lb-i-1]=(int)b[i]-48; 

    //数学加法原理 

    for(i=0;i<1001;i++)

    {

       temp=x[i]-y[i];

       if(temp>=0)

         s[i]=temp;

       else

         {

            s[i]=temp+10;

            x[i+1]--;

         }

    }

    //输出结果 

    for(i=1000;i>=0;i--)

    {

       if(s[i]!=0)

         break;

    }

    if (flag) cout<<"-";

    for(i=i;i>=0;i--)

       cout<<s[i];

    system("pause");

    return 0;

}

高精度乘法:

#include<cstdio>

#include<cstring>

#include<cmath>

#include<malloc.h>

int an,bn,fa=1,fb=1;

char b1[250],b2[250];/*纪录需要计算的两个高精度数据*/

void input(int a1[],int a2[])

{

int i,ai=1,bi=1;

scanf("%s%s",b1,b2);

an=strlen(b1);

bn=strlen(b2);

if(b1[0]==45){an--;fa=-1;ai=0;}

if(b2[0]==45){bn--;fb=-1;bi=0;}

for(i=0;i<an;i++,ai++){a1[i]=b1[an-ai]-'0';

}

for(i=0;i<bn;i++,bi++)a2[i]=b2[bn-bi]-'0';

return;

}

void subtraction(int a[250],int b[250],int q);

void multiplication(int a[],int b[])

{

  int i,j,k;

  int c[501];

  memset(c,0,sizeof c);

  k=an+bn-1;

  for(i=0;i<an;i++)

  for(j=0;j<bn;j++)

  {

   c[i+j]=a[i]*b[j]+c[i+j];

   c[i+j+1]=c[i+j]/10+c[i+j+1];

   c[i+j]=c[i+j]%10;

  }

  while(!c[k])k--;

  if(fa*fb<0) printf("-");

  for(i=k;i>=0;i--) printf("%d",c[i]);

}

  main()

{

  int a[250],b[250];

  memset(a,0,sizeof a);

  memset(b,0,sizeof b);

  input(a,b);

  

  multiplication(a,b);

  system("pause");

  //while(1);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  高精度 数学