高精度

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...