高精度计算 加减乘

高精度加法

//高精度加法
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
    char a1[100],b1[100];
    int a[100],b[100],c[100],lena,lenb,lenc,i,x;
    memset(a,0,sizeof(a));        //清零 
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    gets(a1);        //gets()输入一个字符串,读一整行,到换行符结束。 
    gets(b1);
    lena=strlen(a1);        //strlen()求长度,在此处即为位数 
    lenb=strlen(b1);
    for(i=0;i<lena;i++)        //逆序,从1到lena,下标以1开始。 
    {
        a[lena-i]=a1[i]-48;
    }
    for(i=0;i<lenb;i++)
    {
        b[lenb-i]=b1[i]-48;
    }
    lenc=1;
    x=0;
    while(lenc<=lena||lenc<=lenb)
    {
        c[lenc]=a[lenc]+b[lenc]+x;
        x=c[lenc]/10;
        c[lenc]%=10;
        lenc++;
    }
    c[lenc]=x;
    if(c[lenc]==0)
    {
        lenc--;
    }
    for(i=lenc;i>=1;i--)        //逆序输出 
    {
        cout<<c[i];
    }
    cout<<endl;
    return 0;
 } 
  1. 逆序存储
  2. 位数为存入的字符串的长度
    1. char[],可用strlen(). string可用s.length();
  3. gets(s),可以存入s一行字符串,直到换行符才停止。

高精度减法

//高精度减法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    int a[256],b[256],c[256],lena,lenb,lenc,i;
    char n[256],n1[256],n2[256];
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    printf("input minuend:");
    gets(n1);        //被减数 
    printf("input subtrahead:");
    gets(n2);        //减数 
    //被减数比减数位数小,或者被减数和减数位数一样,但是被减数小于减数;
    //用strcmp来比较大小 
    if(strlen(n1)<strlen(n2)||(strlen(n1)==strlen(n2))&&(strcmp(n1,n2)<0))        
    {
        strcpy(n,n1);        //用strcpy来交换被减数和减数,输出符号,再进行减法运算 
        strcpy(n1,n2);
        strcpy(n2,n);
        cout<<"-";
}
    lena=strlen(n1),lenb=strlen(n2);
    for(i=0;i<lena;i++)
    {
        a[lena-i]=n1[i]-'0';
     } 
     for(i=0;i<lenb;i++)
     {
         b[lenb-i]=n2[i]-'0';
      } 
      i=1;
      while(i<=lena||i<=lenb)
      {
          if(a[i]<b[i])        //借位 
          {
              a[i]+=10;
              a[i+1]--;
          }
        c[i]=a[i]-b[i];
        i++;
        }
    lenc=i;
    while((c[lenc]==0)&&(lenc>1))        //注意个位为0时,不能减去这个位数。 
    lenc--;
    for(i=lenc;i>=1;i--)        //逆序输出 
    {
        cout<<c[i];
    }
    cout<<endl;
    return 0;
}
  1. 可以用位数,初步判断两个数字的大小
  2. 再用strcmp可以判断两个数字的大小(通过ascii码)
    1. 当n1==n2时,返回0;
    2. 当n1>n2时,返回正整数;
    3. 当n1<n2时,返回负整数;
  3. 通过strcpy(des,src);可以将字符串src里的内容传给des;
  4. 字符串输入,可以分开每一位。
  5. 逆序改为数字数组,之所以要逆序是因为要从最小位开始加减。

高精度乘法

#include<iostream>
#include<cstdio>
#include<stdio.h>
#include<cstring>
using namespace std;
int main()
{
    char a1[101], b1[101];
    int a[101], b[101], c[10001], lena, lenb, lenc, i, j, x;
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    memset(c, 0, sizeof(c));
    cin >> a1;
    cin >> b1;
    lena = strlen(a1);
    lenb = strlen(b1);
    for (i = 0; i <= lena - 1; i++)
    {
        a[lena - i] = a1[i] - 48;
    }
    for (i = 0; i <= lenb - 1; i++)
    {
        b[lenb - i] = b1[i] - 48;
    }
    for (i = 1; i <= lena; i++)
    {
        x = 0;
        for (j = 1; j <= lenb; j++)
        {
            c[i + j - 1] = a[i] * b[j] + x + c[i + j - 1];
            x = c[i + j - 1] / 10;
            c[i + j - 1] %= 10;
        }
        c[i + lenb] = x;
    }
    lenc = lena + lenb;
    while (c[lenc] == 0 && lenc > 1)
    {
        lenc--;
    }
    for (i = lenc; i >= 1; i--)
    {
        cout << c[i];
    }
    cout << endl;
    return 0;
}
  1. 从字符串数组转换为整型数组时,一定要看清长度的设定,确定是以0为基还是以1为基。
  2. scanf("%s",a1)的做法在vs里面显示unsafe,但是在dev c++里面没事,vs里面改成cin就没事了。

猜你喜欢

转载自www.cnblogs.com/xuwanwei/p/10787781.html