zoukankan      html  css  js  c++  java
  • 高精度计算 加减乘

    高精度加法

    //高精度加法
    #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就没事了。
  • 相关阅读:
    md5加密排序
    md5加密
    PHP获取文件后缀名
    PHP中使用CURL实现GET、POST、PUT、DELETE请求
    PHP常用正则表达式精选
    19 个让 MySQL 效率提高 3 倍的 SQL 优化技巧
    git clone、 remote、fetch、pull、push、remote
    git 命令常用笔记
    十个推荐使用的 Laravel 的辅助函数
    PHP常用函数大全500+
  • 原文地址:https://www.cnblogs.com/xuwanwei/p/10787781.html
Copyright © 2011-2022 走看看