高精度

来源:https://www.cnblogs.com/chanxe/archive/2022/05/18/16285266.html
-Advertisement-
Play Games

高精度 運算:加法、減法、階乘、乘法 翻轉: 這些運算都是從小位開始,所以一般需要翻轉。以字元串儲存:reverse(a.begin(),a,end())。以數組儲存: for (int i1 = lena1 - 1; i1 >= 0; i1--) { a1[lena1-1-i1] = a[i1] ...


高精度

運算:加法、減法、階乘、乘法

翻轉:

這些運算都是從小位開始,所以一般需要翻轉。以字元串儲存:reverse(a.begin(),a,end())。以數組儲存:

 for (int i1 = lena1 - 1; i1 >= 0; i1--) {
  a1[lena1-1-i1] = a[i1] - '0';
  }
進位、借位:

加法、減法:

 for(int k=0;k<ll+1;k++){//進位運算 
  if(ans[k]>'9'){
  ans[k]-=10;
  ans[k+1]++;
  }
  }
         for(int k=0;k<ll;k++){//借位運算 
  if(ans[k]<'0'){
  ans[k]+=10;
 // cout<<ans[k];
  ans[k+1]--;
  }
  }

乘法:

 if(a[i]>=10)
                {
                     a[i+1]+=a[i]/10;
                     a[i]%=10;
                }
                 a[i]*=N;

具體題目:

P1120 大整數加法

題目描述

給出兩個 200 位以內的正整數,求其和。

輸入描述

多組測試數據。每組測試數據包括兩行,每行一個數。

輸出描述

每組測試輸出一行,為所求兩個整數之和。

樣例輸入

123

456

樣例輸出

579

 #include<iostream>
 #include<string>
 #include<algorithm>
 using namespace std;
 
 int main(){
  string a,b;
  while(cin>>a>>b){
  string ans;
  int aa = a.length();//字元串a長度
  int bb = b.length();//字元串b長度
  int ss = min(aa,bb);//最小長度
  int ll = max(aa,bb);//最大長度
  reverse(a.begin(), a.end());//將字元串翻轉用於從小位開始計算
  reverse(b.begin(), b.end());
 
  for(int i=0;i<ss;i++)
  ans+= a[i]+b[i]-'0';//相同位數之間計算
  if(aa>bb)//將大位數單獨加在字元串尾部
  {
  for(int j=ss;j<aa;j++)
  ans+= a[j];}//將
  else if(bb>aa)
  for (int j=ss;j<bb;j++)
  ans+= b[j];
  ans+='0';//用於最大位進位
  for(int k=0;k<ll+1;k++){//進位運算
  if(ans[k]>'9'){
  ans[k]-=10;
  ans[k+1]++;
  }
  }
  reverse(ans.begin(),ans.end());//翻轉為正常順序
  for(int i=ans.find_first_not_of('0');i<ll+1;i++){//找到第一位不為0的位置,一次輸出
  if(i==-1){
  cout<<0;
  return 0;
  }
  cout<<ans[i]-48;
  }
  cout<<endl;
  }
  return 0;
 
 }
P1121 大整數減法

題目描述

給出兩個 200 位以內的正數,算出第一個數減第二個數的值(結果為正)。

輸入描述

每組測試數據包括兩行,第一行為被減數,第二行為減數。

輸出描述

每組測試數據輸出一行,為所求兩個整數之差。

樣例輸入

987

654

樣例輸出

333

 #include<iostream>
 #include<string>
 #include<algorithm>
 using namespace std;
 
 int main(){
  string a,b,temp;
  int flag = 0;
  while(cin>>a){
  cin>>b;
  string ans;
  int aa = a.length();//字元串a長度
  int bb = b.length();//字元串b長度
  int ss = min(aa,bb);//最小長度
  int ll = max(aa,bb);//最大長度
  reverse(a.begin(), a.end());//將字元串翻轉用於從小位開始計算
  reverse(b.begin(), b.end());
  if(aa==bb){
  if(b>a){
  temp = a;
  a = b;
  b = temp;
  flag = 1;
  }
  }
  else if(bb>aa){
  temp = a;
  a = b;
  b = temp;
  aa = bb;
  flag = 1;
  }
  for(int i=0;i<ss;i++)
  ans+= a[i]-b[i]+'0';//相同位數之間計算
  for(int j=ss;j<ll;j++)
  ans+= a[j];
  for(int k=0;k<ll;k++){//借位運算
  if(ans[k]<'0'){
  ans[k]+=10;
 // cout<<ans[k];
  ans[k+1]--;
  }
  }
  reverse(ans.begin(),ans.end());//翻轉為正常順序
  if(flag) cout<<'-';
  for(int i=ans.find_first_not_of('0');i<ll;i++){//找到第一位不為0的位置,一次輸出
 
  cout<<ans[i]-48;
  }
  cout<<endl;
  }
  return 0;
 
 }
P1134 高精度階乘

題目描述

求一個非負整數 N 的階乘的精確值(N 的大小保證 N 的階乘不超過 3000 位)。

輸入描述

有多組測試數據,每組測試數據包含一行非負整數 N。

輸出描述

對於每組測試數據,輸出一行答案。

樣例輸入

3

10

50

樣例輸出

6

3628800

30414093201713378043612608166064768844377641568960512000000000000

 #include<bits/stdc++.h>
 using namespace std;
 //對每一位進行數字乘法,處理好進位
 int main()
 {
     int N;
     while(cin>>N)
    {
         int a[3001]={0};
         int i=0;
         a[0]=1;
         while(N)
        {
             for(i=0;i<3001;i++)
            {
                 if(a[i]>=10)
                {
                     a[i+1]+=a[i]/10;
                     a[i]%=10;
                }
                 a[i]*=N;
            }
             N--;
        }
         while(a[i]==0)
        {
             i--;
        }
         for(;i>=0;i--)
             cout<<a[i];
         cout<<endl;
    }
     return 0;
 }
P1136 高精度乘法

題目描述

給出兩個長度小於 100 位的正整數,求其乘積。

輸入描述

兩行,一行一個數。

輸出描述

一行,為所求乘積。

樣例輸入

1937

2931

樣例輸出

5677347

 #include<iostream> 
 #include<cstring>
 using namespace std;
 //將字元串每一位改為數字,再反向計算,最後處理進位問題。
 int main() {
  char a[101], b[101];       //定義字元數組是為了好測量,輸入的長度
  while (cin >> a >> b) {
  char swap[101];         //用來進行交換的,超過a的長度小於b的長度
  int a1[101] = { 0 }, b1[101] = { 0 };  //接受a與b的,並將其轉化為整形數組和反轉
  int lena1, lenb1;      //測量a與b的長度
  lena1 = strlen(a), lenb1 = strlen(b);
  int n;                 //接受lena1與lena2的最大值,並且為下麵的動態數組做準備
  n = (lena1 > lenb1 ? lena1 : lenb1);
  //申請動態數組,a與b的乘積最多有2*n位數
  int *p;
  p = new int[2 * n];
  //將p數組清零
  memset(p, 0, sizeof(int)*(2 * n));
  //控制b1為最短的數組
  if (lena1 < lenb1) {
  strcpy(swap, b);
  strcpy(b, a);
  strcpy(a, swap);
  }
  lena1 = strlen(a), lenb1 = strlen(b);
  //反轉a數組
  for (int i1 = lena1 - 1; i1 >= 0; i1--) {
  a1[lena1-1-i1] = a[i1] - '0';
  }
  //反轉數組b
  for (int k1 = lenb1 - 1; k1 >= 0; k1--) {
  b1[lenb1 - 1 - k1] = b[k1] - '0';
  }
  int len;    //控制p數組從第幾位開始
  for (int i = 0; i < lenb1; i++) {
  len = i;
  for (int k = 0; k < lena1; k++) {
  p[len] += b1[i] * a1[k];
  if (p[len] > 9) {
  p[len + 1] += p[len] / 10;
  p[len] = p[len] % 10;
  }
  len++;
  }
  }
  while (p[len] == 0) {
  len--;
  }
  for (int k2 = len ; k2 >= 0; k2--) {
  cout << p[k2];
  }
  delete[]p;
  cout << endl;
  }
  return 0;
 }
 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、吐槽 已經是凌晨12點了我還是睡不著 我所有的實體類時間用的j8的LocalDateTime 這就導致一個問題:jackson不能序列化時間,因為它不支持j8的Api,讓我添加 jackson-datatype-jsr310 解決 二、問題 如果是這樣做統一返回結果集需要 private sta ...
  • 知識回顧 解析完Bean信息的合併,可以知道Spring在實例化Bean之後,屬性填充前,對Bean進行了Bean的合併操作,這裡的操作主要做了對Bean對象標記了@Autowired、@Value、@Resource、@PostConstruct、@PreDestroy註解的欄位或者方法進行解析, ...
  • Cookied的設置會造成XSS攻擊,所以出現了防禦機制HttpOnly標誌(可選),客戶端腳本將無法訪問cookie(如果瀏覽器支持該標誌的話)。因此即使客戶端存在跨站點腳本(XSS)漏洞,瀏覽器也不會將Cookie透露給第三方。Cookie和Session後面還會設計到xss和csrf漏洞的利用... ...
  • 為了修複生產數據,需要執行一段一次性的代碼。 鑒於是spring老項目,就想到了InitializingBean。 代碼如下。服務啟動後,log里發現出現2條“一次性任務開始”。 好在裡面邏輯做了防重控制,沒有受到什麼影響。 @Slf4j @Component public class TransT ...
  • 什麼是隱藏類 隱藏類,是一種不能被其他類直接使用的類。引入隱藏類的主要目的是給框架來使用,使得框架可以在運行時生成類,並通過反射間接使用它們。可能有點抽象,不要緊,下麵我們通過一個例子來直觀的認識它! 隱藏類案例 第一步:先創建一個普通的Java類 public class JEP371Hidden ...
  • 下麵介紹的是JUC包下一些線程安全類的一些簡單使用和一些小demo。 Semaphore 信號量,即可以同時使用的線程數,tryrequire就是將信號量減一,release就是信號量+1,當等於0就會阻塞,大於零才會喚醒。 當需要控制線程訪問數量,可以使用信號量來做控制,比較簡單。 下麵是使用信號 ...
  • Spring Ioc源碼分析系列--Ioc容器註冊BeanPostProcessor後置處理器以及事件消息處理 前言 上一篇分析了BeanFactoryPostProcessor的作用,那麼這一篇繼續在refresh()方法里游蕩,相信對Spring熟悉點的朋友,在看完BeanFactoryPost ...
  • 大家好,這篇文章分享了C程式設計(譚浩強)第五版第十章課後題答案,所有程式已經測試能夠正常運行,如果小伙伴發現有錯誤的的地方,歡迎留言告訴我,我會及時改正!感謝大家的觀看!!! ...
一周排行
    -Advertisement-
    Play Games
  • Github / Gitee QQ群(1群) : 813100564 / QQ群(2群) : 579033769 視頻教學 介紹 MiniWord .NET Word模板引擎,藉由Word模板和數據簡單、快速生成文件。 Getting Started 安裝 nuget link : https:// ...
  • Array.Sort Array類中相當實用的我認為是Sort方法,相比起冗長的冒泡排序,它的出現讓排序更加的簡化 結果如下: 還可以聲明一個靜態方法用來專門調用指定數組排序,從名為 array 的一維數組中 a 索引處開始,到 b 元素 從小到大排序。 註意: a + b 不能大於 array 的 ...
  • 前言 在上一篇文章CLR類型系統概述里提到,當運行時掛起時, 垃圾回收會執行堆棧遍歷器(stack walker)去拿到堆棧上值類型的大小和堆棧根。這裡我們來翻譯BotR里一篇專門介紹Stackwalking的文章,希望能加深理解。 順便說一句,StackWalker在中文里似乎還沒有統一的翻譯,J ...
  • 使用過 nginx 的小伙伴應該都知道,這個中間件是可以設置跨域的,作為今天的主角,同樣的 反向代理中間件的 YARP 毫無意外也支持了跨域請求設置。 有些小伙伴可能會問了,怎樣才算是跨域呢? 在 HTML 中,一些標簽,例如 img、a 等,還有我們非常熟悉的 Ajax,都是可以指向非本站的資源的 ...
  • 什麼是Git Git 是一個開源的分散式版本控制系統,用於敏捷高效地處理任何或小或大的項目。 Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體。 Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的 ...
  • 首先CR3是什麼,CR3是一個寄存器,該寄存器內保存有頁目錄表物理地址(PDBR地址),其實CR3內部存放的就是頁目錄表的記憶體基地址,運用CR3切換可實現對特定進程記憶體地址的強制讀寫操作,此類讀寫屬於有痕讀寫,多數驅動保護都會將這個地址改為無效,此時CR3讀寫就失效了,當然如果能找到CR3的正確地址... ...
  • 說明 onlyoffice為一款開源的office線上編輯組件,提供word/excel/ppt編輯保存操作 以下操作均基於centos8系統,officeonly鏡像版本7.1.2.23 鏡像下載地址:https://yunpan.360.cn/surl_y87CKKcPdY4 (提取碼:1f92 ...
  • 二叉樹查找指定的節點 前序查找的思路 1.先判斷當前節點的no是否等於要查找的 2.如果是相等,則返回當前節點 3.如果不等,則判斷當前節點的左子節點是否為空,如果不為空,則遞歸前序查找 4.如果左遞歸前序查找,找到節點,則返回,否繼續判斷,當前的節點的右子節點是否為空,如果不為空,則繼續向右遞歸前 ...
  • ##Invalid bound statement (not found)出現原因和解決方法 ###前言: 想必各位小伙伴在碼路上經常會碰到奇奇怪怪的事情,比如出現Invalid bound statement (not found),那今天我就來分析以下出現此問題的原因。 其實出現這個問題實質就是 ...
  • ###一、背景知識 爬蟲的本質就是一個socket客戶端與服務端的通信過程,如果我們有多個url待爬取,只用一個線程且採用串列的方式執行,那隻能等待爬取一個結束後才能繼續下一個,效率會非常低。 需要強調的是:對於單線程下串列N個任務,並不完全等同於低效,如果這N個任務都是純計算的任務,那麼該線程對c ...