高精度

来源: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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...