?歸納編程學習的感悟,
記錄奮斗路上的點滴,
希望能幫到一樣刻苦的你!
如有不足歡迎指正!
共同學習交流!
🌎歡迎各位→點贊 👍+ 收藏? + 留言?📝
唯有主動付出,才有豐富的果實獲得收獲!
高精度乘法
#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "const int N=1e5+100; // 定義一個較大的數組大小,用于存儲大整數string s1,s2; // 用于輸入兩個字符串形式的大整數
int a[N],b[N],c[N],ans,ma; // a 和 b 存儲兩個大整數的每一位數字,c 存儲結果,ans 用于進位,ma 記錄較大數的位數int main()
{cin>>s1>>s2; // 輸入兩個大整數(以字符串形式)int j=1,k=1;// 將字符串 s1 的每一位數字從低位到高位存入數組 afor(int i=s1.size()-1;i>=0;i--) a[j++]=s1[i]-'0';// 將字符串 s2 的每一位數字從低位到高位存入數組 bfor(int i=s2.size()-1;i>=0;i--) b[k++]=s2[i]-'0';// 獲取兩個大整數的最大長度ma=max(s1.size(),s2.size());// 模擬豎式加法,逐位相加并處理進位for(int i=1;i<=ma;i++){ans+=a[i]+b[i]; // 當前位相加,并加上上一位的進位c[i]=ans%10; // 當前位的結果是相加后的個位數ans/=10; // 更新進位值}// 如果最高位仍有進位,則需要額外增加一位if(ans) c[++ma]=ans;// 從高位到低位輸出結果for(int i=ma;i>=1;i--)cout<<c[i];return 0;
}
高精度減法
#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "const int N=1e5+100; // 定義一個較大的數組大小,用于存儲大整數string s1,s2; // 用于輸入兩個字符串形式的大整數
int a[N],b[N],c[N],ma; // a 和 b 存儲兩個大整數的每一位數字,c 存儲結果,ma 記錄較大數的位數int main()
{cin>>s1>>s2; // 輸入兩個大整數(以字符串形式)// 如果 s1 小于 s2,則交換兩者,并輸出負號表示結果為負數if(s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2)){cout<<'-'; // 輸出負號swap(s1,s2); // 交換 s1 和 s2 的值,確保 s1 始終是較大的數}int j=1,k=1;// 將字符串 s1 的每一位數字從低位到高位存入數組 afor(int i=s1.size()-1;i>=0;i--) a[j++]=s1[i]-'0';// 將字符串 s2 的每一位數字從低位到高位存入數組 bfor(int i=s2.size()-1;i>=0;i--) b[k++]=s2[i]-'0';// 獲取兩個大整數的最大長度ma=max(s1.size(),s2.size());// 模擬豎式減法,逐位相減并處理借位for(int i=1;i<=ma;i++){if(a[i]-b[i]<0) // 如果當前位不夠減{a[i]+=10; // 向高位借 10a[i+1]-=1; // 高位減 1}c[i]=a[i]-b[i]; // 當前位的結果是相減后的值}// 去掉結果中的前導零while(c[ma]==0&&ma>1) ma--;// 從高位到低位輸出結果for(int i=ma;i>=1;i--)cout<<c[i];return 0;
}
高精度乘法
#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "const int N=1e5+100; // 定義一個較大的數組大小,用于存儲大整數string s1,s2; // 用于輸入兩個字符串形式的大整數
int a[N],b[N],s[N],c[N],ans,ma; // a 和 b 存儲兩個大整數的每一位數字,s 存儲中間結果,c 存儲最終結果,ans 用于進位,ma 記錄結果的最大可能位數int main()
{ cin>>s1>>s2; // 輸入兩個大整數(以字符串形式)int j=1,k=1;// 將字符串 s1 的每一位數字從低位到高位存入數組 afor(int i=s1.size()-1;i>=0;i--) a[j++]=s1[i]-'0';// 將字符串 s2 的每一位數字從低位到高位存入數組 bfor(int i=s2.size()-1;i>=0;i--) b[k++]=s2[i]-'0';// 計算結果的最大可能位數ma=s1.size()+s2.size()-1; // 兩個數相乘的結果最多有 s1.size() + s2.size() - 1 位// 模擬豎式乘法,逐位相乘并累加到中間結果數組 s 中for(int i=1;i<=s1.size();i++){for(int j=1;j<=s2.size();j++){s[i+j-1]+=a[i]*b[j]; // 將第 i 位和第 j 位相乘的結果累加到對應的位置}}// 處理進位,將中間結果數組 s 轉換為最終結果數組 cfor(int i=1;i<=ma;i++){ans+=s[i]; // 累加當前位的值和之前的進位c[i]=ans%10; // 當前位的結果是累加值的個位數ans/=10; // 更新進位值}// 如果最高位仍有進位,則需要額外增加一位if(ans) c[++ma]=ans;// 去掉結果中的前導零while(c[ma]==0&&ma>1) ma--;// 從高位到低位輸出結果for(int i=ma;i>=1;i--)cout<<c[i];return 0;
}
高精度除法
#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "const int N=1e5+10; // 定義一個較大的數組大小,用于存儲大整數string s1; // 用于輸入字符串形式的大整數
int a[N],b,c[N],ans,ma; // a 存儲大整數的每一位數字,b 是除數,c 存儲結果,ans 用于存儲當前余數,ma 記錄大整數的位數int main()
{cin>>s1>>b; // 輸入大整數(以字符串形式)和除數 bint j=1;// 將字符串 s1 的每一位數字從低位到高位存入數組 afor(int i=s1.size()-1;i>=0;i--) a[j++]=s1[i]-'0';ma=s1.size(); // 獲取大整數的位數// 模擬豎式除法,逐位計算商和余數for(int i=ma;i>=1;i--){ans=ans*10+a[i]; // 當前余數乘以 10 加上當前位的數字c[i]=ans/b; // 當前位的商是當前余數除以除數 b 的結果ans%=b; // 更新余數為當前余數對除數 b 取模的結果}// 去掉結果中的前導零while(c[ma]==0&&ma>1) ma--;// 從高位到低位輸出結果for(int i=ma;i>=1;i--)cout<<c[i];return 0;
}
高精度階乘和
#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "const int N=1e5+10; // 定義一個較大的數組大小,用于存儲大整數int n,a[N],b[N],ans,ma,mb; // a 存儲當前階乘的結果,b 存儲前 n 個階乘的和,ans 用于進位,ma 和 mb 分別記錄當前階乘和總和的最大位數int main()
{cin>>n; // 輸入 n,表示求前 n 個階乘的和for(int k=1;k<=n;k++) // 外層循環:求前 n 個階乘的和{a[1]=1; ma=1; // 初始化當前階乘為 1(即 1 的階乘),并設置最大位數為 1for(int i=1;i<=k;i++) // 內層循環:計算 k 的階乘{ans=0; // 初始化進位值為 0// 高精度乘法:將當前階乘結果 a 乘以 ifor(int j=1;j<=ma;j++){ans+=a[j]*i; // 當前位乘以 i 并加上之前的進位a[j]=ans%10; // 當前位的結果是累加值的個位數ans/=10; // 更新進位值}// 如果最高位仍有進位,則需要擴展位數while(ans){a[++ma]=ans%10; // 將進位值添加到新的高位ans/=10; // 繼續處理進位}}// 更新總和的最大位數mb=max(ma,mb); ans=0;// 高精度加法:將當前階乘結果 a 加到總和 b 中for(int i=1;i<=mb;i++){ans+=a[i]+b[i]; // 累加當前位和之前的進位b[i]=ans%10; // 當前位的結果是累加值的個位數ans/=10; // 更新進位值}// 如果最高位仍有進位,則需要擴展位數if(ans) b[++mb]=ans;} // 從高位到低位輸出結果for(int i=mb;i>=1;i--)cout<<b[i]; return 0;
}