亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用C++怎么實現一個高精度算法

發布時間:2021-04-16 18:03:50 來源:億速云 閱讀:289 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關使用C++怎么實現一個高精度算法,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

1. 高精度加法

以3479957928375817 + 897259321544245為例:

3479957928375817
+897+2593+2154+4245
====
437612172499110062
進位0進位1進位0進位1
4377217249920062

C語言實現代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 200

//整數乘冪運算函數
int Pow(int a, int b)
{
  int i = 0, result = 1;
  for(i = 0; i < b; ++i)
  {
    result *= a;
  }
  return result;
}


//High Precision Of Addition
int main()
{
  char stra[N], strb[N];   //字符串數組,以字符形式儲存兩個大數;
  int i = 0, step = 4, carry = 0; //step表示塊長,carry為進位位;
  int lengtha, lengthb, maxlength, resultsize;  //maxlength表示stra和strb二者長度較大的那個;
  int numa[N], numb[N],numc[N];  //依次儲存被加數,加數,和;
  memset(numa, 0, sizeof(numa));
  memset(numb, 0, sizeof(numb));
  memset(numc, 0, sizeof(numc));     //初始化為零;
  scanf("%s%s", stra, strb);
  lengtha = strlen(stra);
  lengthb = strlen(strb);   //計算兩個大數的長度
  //字符數字轉為四位一塊的整數數字
  for(i = lengtha-1; i >= 0; --i)
  {
    numa[(lengtha-1-i)/step] += (stra[i]-'0')*Pow(10,(lengtha-1-i)%step);
  }
  for(i = lengthb-1; i >= 0; --i)
  {
    numb[(lengthb-1-i)/step] += (strb[i]-'0')*Pow(10,(lengthb-1-i)%step);
  }
  maxlength = lengtha > lengthb ? lengtha : lengthb;

  //逐塊相加,并進位
  for(i = 0; i <= maxlength/step; ++i)
  {
    numc[i] = (numa[i] + numb[i])%Pow(10, step) + carry;  //計算和
    carry = (numa[i] + numb[i])/Pow(10, step); //計算進位
  }

  //計算最后和的塊的總數
  resultsize = numc[maxlength/step] > 0 ? maxlength/step : maxlength/step - 1;
  printf("%d", numc[resultsize]);
  for(i = resultsize-1; i >= 0; --i)
  {
    printf("%04d", numc[i]);  //右對齊,補零輸出;
  }
  printf("\n");
  return 0;
}

2. 高精度減法

與加法類似,不同的是要注意正負號和顯示位數的變化。以99999037289799 - 100004642015000為例:

先判斷被減數和減數哪個大,顯然這里減數大,故輸出結果為負數。在用大數減去小數,(若某一塊相減為負數,則要向高位塊借位)如下表

100004642015000
-99-9990-3728-9799
1564735201
借位0借位1借位0借位1
0564725201

C語言實現代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 200

//整數乘冪運算函數
int Pow(int a, int b)
{
  int i = 0, result = 1;
  for(i = 0; i < b; ++i)
  {
    result *= a;
  }
  return result;
}

//High Precision Of Subtraction
int main()
{
  char stra[N], strb[N];   //字符串數組,以字符形式儲存兩個大數;
  int i = 0, step = 4, borrow = 0, mark = 0; //step表示塊長,borrow為借位位, mark為結果符號位;
  int lengtha, lengthb, maxlength, resultsize;  //maxlength表示stra和strb二者長度較大的那個;
  int numa[N], numb[N],numc[N], *maxnum, *minnum;  //依次儲存被減數,減數,和;
  memset(stra, 0, sizeof(stra));
  memset(strb, 0, sizeof(strb));
  memset(numa, 0, sizeof(numa));
  memset(numb, 0, sizeof(numb));
  memset(numc, 0, sizeof(numc));     //初始化為零;
  scanf("%s%s", stra, strb);
  lengtha = strlen(stra);
  lengthb = strlen(strb);   //計算兩個大數的長度
  maxlength = lengtha >= lengthb ? lengtha : lengthb;

  //字符數字轉為四位一塊的整數數字
  for(i = lengtha-1; i >= 0; --i)
  {
    numa[(lengtha-1-i)/step] += (stra[i]-'0')*Pow(10,(lengtha-1-i)%step);
  }
  for(i = lengthb-1; i >= 0; --i)
  {
    numb[(lengthb-1-i)/step] += (strb[i]-'0')*Pow(10,(lengthb-1-i)%step);
  }

  //找出較大的數
  maxnum = numa;
  minnum = numb;
  mark = 1;
  for(i = (maxlength-1)/step; i >= 0; --i)
  {
    if(numa[i] > numb[i])
    {
      maxnum = numa;
      minnum = numb;
      mark = 1;
      break;
    }
    else if(numa[i] < numb[i])
    {
      maxnum = numb;
      minnum = numa;
      mark = -1;
      break;
    }
  }

  //逐塊相減,并借位
  for(i = 0; i <= maxlength/step; ++i)
  {
    numc[i] = (maxnum[i] - minnum[i] + Pow(10, step) + borrow)%Pow(10,step);  //計算差
    borrow = (maxnum[i] - minnum[i] + Pow(10, step) + borrow)/Pow(10, step) - 1; //計算借位
  }

  //計算最后和的塊的總數
  resultsize = maxlength/step;
  while(!numc[resultsize])  --resultsize;
  printf("%d", mark*numc[resultsize]);
  for(i = resultsize-1; i >= 0; --i)
  {
    printf("%04d", numc[i]);  //右對齊,補零輸出;
  }
  printf("\n");
  return 0;
}

3. 高精度乘法

乘法可以看作是乘數每一位與被乘數相乘后再相加,以4296556241 x 56241為例:

被乘數4296556241
乘數56241
被乘數x乘數4296556241
14296556241
4168*1038620*1024964*10
284*10019310*10012482*100
6252*100057930*100037446*1000
5210*1000048275*1000031205*10000
累加和2362122543006855351000081
進位(從低位向高位)2415430435100
241642619550081

C語言實現代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 200

//整數乘冪運算函數
int Pow(int a, int b)
{
  int i = 0, result = 1;
  for(i = 0; i < b; ++i)
  {
    result *= a;
  }
  return result;
}


//High Precision Of Multiplication
int main()
{
  char stra[N], strb[N];   //字符串數組,以字符形式儲存兩個大數;
  int i = 0, j = 0, k = 0, step = 4, carry = 0; //step表示塊長,carry為進位位;
  int lengtha, lengthb, resultsize, tmpsize, eachnum; //resultsize儲存塊的總數,eachnum用來儲存乘數的每一位
  int numa[N], numb[N], numc[N], tmp[N];  //依次儲存被乘數數&積,乘數;
  memset(numa, 0, sizeof(numa));
  memset(numb, 0, sizeof(numb));
  memset(numc, 0, sizeof(numc)); //初始化為零;
  scanf("%s%s", stra, strb);
  lengtha = strlen(stra);
  lengthb = strlen(strb);   //計算兩個大數的長度
  //將被乘數字符數字轉為四位一塊的整數數字
  for(i = lengtha-1; i >= 0; --i)
  {
    numa[(lengtha-1-i)/step] += (stra[i]-'0')*Pow(10,(lengtha-1-i)%step);
  }
  //將乘數數字字符數字轉為一位一塊的整數數字
  for(i = lengthb-1; i >= 0; --i)
  {
    numb[lengthb-1-i] = strb[i]-'0';
  }

  resultsize = tmpsize = (lengtha-1)/step;
  //取乘數的每一位與被乘數的逐塊相乘,并進位;
  for(i = 0; i < lengthb; ++i)
  {
    memcpy(tmp, numa, sizeof(numa));  //將numa數組賦值給tmp數組;

    k = i/step;   //k儲存每一塊需要向高位塊移動的次數;
    if(k)
    {
      for(j = tmpsize; j >= 0; --j)
      {
        tmp[j+k] = tmp[j];
        tmp[j] = 0;
      }
      tmpsize += k;
    }

    //乘以乘數每一位擴展成的塊;
    eachnum = numb[i]*Pow(10, i%step);
    for(j = 0; j <= tmpsize; ++j)
    {
      tmp[j] *= eachnum;
    }

    //大數相加
    carry = 0; //進位置零;
    for(j = 0; j <= resultsize; ++j)
    {
      numc[j] += tmp[j] + carry;
      carry = numc[j]/Pow(10,step);
      numc[j] %= Pow(10, step);
    }
    if(carry)
    {
      ++resultsize;
      numc[j] += carry;
    }
  }

  //輸出
  printf("%d", numc[resultsize]);
  for(i = resultsize-1; i >= 0; --i)
  {
    printf("%04d", numc[i]);  //右對齊,補零輸出;
  }
  printf("\n");
  return 0;
}

4. 高精度除法

高精度除法有兩種,一種是高精度除以低精度,另一種是高精度除以高精度。前者只需將每一塊除以低精度除數即可;后者則考慮用高精度減法來實現,即每次減去高精度除數,直到減到小于除數,則減的次數即為商,剩余的即為余數。

高精度除以低精度
以9876342876 / 343為例:

被除數9876342876
除數343
向低位塊進位98137190
028794002
余數190

C語言代碼實現如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 200

//整數乘冪運算函數
int Pow(int a, int b)
{
  int i = 0, result = 1;
  for(i = 0; i < b; ++i)
  {
    result *= a;
  }
  return result;
}

//High Precision Of division
//(1)高精度除以低精度
int main()
{
  char stra[N];   //字符串數組,以字符形式儲存高精度被除數;
  int i = 0, step = 4, carry = 0; //step表示塊長,carry為高位向低位進位位;
  int lengtha, resultsize;
  int numa[N], numb, numc[N], numd;  //依次儲存被除數,除數,商, 余數;
  memset(numa, 0, sizeof(numa));
  memset(numc, 0, sizeof(numc));     //初始化為零;
  scanf("%s%d", stra, &numb);
  lengtha = strlen(stra);  //計算被除數的長度

  //字符數字轉為四位一塊的整數數字
  for(i = lengtha-1; i >= 0; --i)
  {
    numa[(lengtha-1-i)/step] += (stra[i]-'0')*Pow(10,(lengtha-1-i)%step);
  }

  carry = 0; //高位向低位進位位置零
  resultsize = (lengtha-1)/step;
  //逐塊相除,高位向低位進位
  for(i = resultsize; i >= 0; --i)
  {
    numc[i] = (numa[i] + carry*Pow(10,step))/numb;  //計算商
    carry = (numa[i] + carry*Pow(10,step))%numb; //計算進位
  }
  numd = carry;  //最低位塊的余數即為整個除法的余數

  //計算最后和的塊的總數
  while(!numc[resultsize])  --resultsize;
  //輸出商
  printf("%d", numc[resultsize]);
  for(i = resultsize-1; i >= 0; --i)
  {
    printf("%04d", numc[i]);  //右對齊,補零輸出;
  }
  //輸出余數
  printf("\n%d\n", numd);
  return 0;
}

高精度除以高精度
以176342876 / 3453452為例:

被除數176342876
- (51 x 除數)51 x 3453452
余數216824
51

C語言代碼實現如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 200

//整數乘冪運算函數
int Pow(int a, int b)
{
  int i = 0, result = 1;
  for(i = 0; i < b; ++i)
  {
    result *= a;
  }
  return result;
}

//High Precision Of division
//(2)高精度除以高精度
int main()
{
  char stra[N], strb[N];   //字符串數組,以字符形式儲存兩個大數;
  int i = 0, step = 4, borrow = 0; //step表示塊長,borrow為進位位;
  int lengtha, lengthb, tmpnum, numbsize, numcsize, numdsize, maxsize, mark;  //maxlength表示stra和strb二者長度較大的那個;
  int numa[N], numb[N], numc[N], numd[N];  //依次儲存被除數數,除數數,商,余數;
  memset(stra, 0, sizeof(stra));
  memset(strb, 0, sizeof(strb));
  memset(numa, 0, sizeof(numa));
  memset(numb, 0, sizeof(numb));
  memset(numc, 0, sizeof(numc));
  memset(numd, 0, sizeof(numd));   //初始化為零;
  scanf("%s%s", stra, strb);
  lengtha = strlen(stra);
  lengthb = strlen(strb);   //計算兩個大數的長度

  //字符數字轉為四位一塊的整數數字
  for(i = lengtha-1; i >= 0; --i)
  {
    numa[(lengtha-1-i)/step] += (stra[i]-'0')*Pow(10,(lengtha-1-i)%step);
  }
  for(i = lengthb-1; i >= 0; --i)
  {
    numb[(lengthb-1-i)/step] += (strb[i]-'0')*Pow(10,(lengthb-1-i)%step);
  }
  memcpy(numd, numa, sizeof(numa));
  numbsize = (lengthb-1)/step;
  numcsize = 0;
  numdsize = (lengtha-1)/step;

  do
  {
    maxsize = numdsize > numbsize ? numdsize : numbsize;
    //計算剩余數是否小于除數
    mark = 1;
    for(i = maxsize; i >= 0; --i)
    {
      if(numd[i] > numb[i])
      {
        mark = 1;
        break;
      }
      else if(numd[i] < numb[i])
      {
        mark = -1;
        break;
      }
    }

    //判斷是否余數已經小于除數
    if(!(mark+1))  break;

    borrow = 0; //借位置零;
    //逐塊相減,并借位
    for(i = 0; i <= maxsize; ++i)
    {
      tmpnum = (numd[i] - numb[i] + Pow(10, step) + borrow)%Pow(10,step);  //計算差
      borrow = (numd[i] - numb[i] + Pow(10, step) + borrow)/Pow(10,step) - 1; //計算借位
      numd[i] = tmpnum;
    }
    while(!numd[numdsize]) --numdsize;

    //每減一個除數,商加一;
    borrow = 1;
    for(i = 0; i <= numcsize; ++i)
    {
      numc[i] += borrow;
      borrow = numc[i]/Pow(10,step);
      numc[i] %= Pow(10,step);
    }
    if(borrow)
    {
      ++numcsize;
      numc[i] += borrow;
    }
  }while(1);

  printf("%d", numc[numcsize]);
  for(i = numcsize-1; i >= 0; --i)
  {
    printf("%04d", numc[i]);  //右對齊,補零輸出;
  }
  printf("\n");
  printf("%d", numd[numdsize]);
  for(i = numdsize-1; i >= 0; --i)
  {
    printf("%04d", numd[i]);  //右對齊,補零輸出;
  }
  printf("\n");
  return 0;
}

上述就是小編為大家分享的使用C++怎么實現一個高精度算法了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

玉树县| 徐州市| 龙岩市| 花莲县| 多伦县| 井陉县| 同心县| 岑溪市| 莆田市| 肥乡县| 苍溪县| 诸城市| 满洲里市| 陇西县| 章丘市| 临潭县| 万载县| 西充县| 道真| 深圳市| 江油市| 毕节市| 武威市| 台东市| 西贡区| 贡山| 安康市| 黔西县| 武冈市| 信阳市| 江西省| 治多县| 东兴市| 望奎县| 彰化市| 隆昌县| 阜阳市| 石河子市| 都匀市| 嵊泗县| 桑日县|