高精度

来源: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
  • 前言 JSON Web Token(JWT)是一個非常輕巧的規範。這個規範允許我們使用 JWT 在用戶和伺服器之間傳遞安全可靠的信息。一個 JWT 實際上就是一個字元串,它由三部分組成,頭部、載荷與簽名。前兩部分需要經過 Base64 編碼,後一部分通過前兩部分 Base64 編碼後再加密而成。針對 ...
  • 一:背景 1. 講故事 今天本來想寫一篇 非托管泄露 的生產事故分析,但想著昨天就上了一篇非托管文章,連著寫也沒什麼意思,換個口味吧,剛好前些天有位朋友也找到我,說他們的拍攝監控軟體卡死了,讓我幫忙分析下為什麼會卡死,聽到這種軟體,讓我不禁想起了前些天 在程式員桌子上安裝監控 的新聞,參考如下: 我 ...
  • 文章目錄 介紹 ABP的依賴註入系統是基於Microsoft的依賴註入擴展庫(Microsoft.Extensions.DependencyInjection nuget包)開發的。所以我們採用dotnet自帶的註入方式也是支持的。 由於ABP是一個模塊化框架,因此每個模塊都定義它自己的服務併在它自 ...
  • 前言 外觀模式,英文名稱是:Facade Pattern。我們先從名字上來理解一下“外觀模式”。我看到了“外觀”這個詞語,就想到了“外表”這個詞語,兩者有著很相近的意思。就拿談戀愛來說,“外表”很重要,如果第一眼看著很舒服、有眼緣,那就有交往下去的可能。如果長的“三寸釘、枯樹皮”,估計就夠嗆了。在這 ...
  • 模擬.NET實際應用場景,綜合應用三個主要知識點:一是使用dnSpy反編譯第三庫及調試,二是使用Lib.Harmony庫實現第三庫攔截、偽造,三是實現同一個庫支持多版本同時引用。 ...
  • 通過strimzi部署的kafka集群,如何部署prometheus+grafana去監控呢?官方文檔信息量太大,即便照著做也可能失敗,這裡有一份詳細的保姆級操作指南,助您成功部署監控服務 ...
  • 在工具類中封裝getBean,使用哪個介面來實現 實事上,在工具類中,實現BeanFactoryPostProcessor和ApplicationContextAware介面後,使用它們構造方法里的對象ConfigurableListableBeanFactory和ApplicationContex ...
  • 1章:系統基礎信息模塊詳解 通過第三方模塊獲取伺服器的基本性能、塊設備、網卡介面、網路地址庫等信息。 1.1 系統性能模塊psutil:獲取系統性能信息、記憶體信息、磁碟信息、網路信息、用戶信息等。 1.2 IP地址處理模塊IPy: 處理IP地址,網段等。 1.3 DNS處理模塊dnspython: ...
  • EasyExcel動態表頭導出(支持多級表頭) 在很多業務場景中,都會應用到動態表頭的導出,也會涉及到多級表頭的導出,如下圖所示 通過EasyExcel,我們可以快速實現這一需求,具體代碼如下 DynamicHeader import java.util.List; /** *@Author: <a ...
  • 基於java線上婚紗定製系統設計與實現,可適用於線上婚紗攝影預定系統,基於web的婚紗影樓管理系統設計,基於web的婚紗影樓管理系統設計,婚紗攝影網系統,婚紗攝影網站系統,婚紗攝影網站系統,婚紗系統,婚紗管理系統等等; ...