1. 程式人生 > 其它 >大整數加法乘法

大整數加法乘法

技術標籤:演算法

兩個大整數加法 普通整形或者長整型儲存不下的時候 需要用到字元 和陣列
由於加法會進位 所以我們需要將數字反向放入陣列 將第0位 存入字元長度
在這裡插入圖片描述

#include<iostream>
#include<cstring>
using namespace std;
int num1[105],num2[105],sum[105];
char s1[105],s2[105];

int main(){
    cin>>s1>>s2;
    num1[0] =strlen(s1);
    num2[0] =strlen(s2);
    for
(int i=0,j = num1[0];i<num1[0];i++,j--){ num1[j]=s1[i]-'0'; } for(int i=0,j = num2[0];i<num2[0];i++,j--){ num2[j]=s2[i]-'0'; } sum[0]=max(num1[0],num2[0]); for(int i=1;i<=sum[0];i++){ sum[i] =num1[i] +num2[i]; } for(int i=1;i<=sum[0];i++){ if
(sum[i] > 9){ //存在進位的情況下 sum[i+1]++; sum[i]-=10; if(i==sum[0]){ sum[0]++; //存在進位就加位數 使迴圈再多進行一位 } } } for(int i=sum[0];i>0;i--){ cout<<sum[i]; } cout<<endl; return 0; }

在這裡插入圖片描述
乘法

#include<iostream>
#include<cstring> #include<cmath> using namespace std; int main(){ char s1[1005],s2[1005]; int n1[1005]={0},n2[1005]={0},ans[1005]={0}; cin >> s1 >>s2; n1[0]=strlen(s1),n2[0]=strlen(s2); ans[0]=n1[0]+n2[0]-1; //兩位乘兩位就是三位 for(int i=1,j=n1[0]-1;i<=n1[0];i++,j--){ n1[i]=s1[j]-'0'; } for(int i=1,j=n2[0]-1;i<=n2[0];i++,j--){ n2[i]=s2[j]-'0'; } for(int i=1;i<=n1[0];i++){ //用新的陣列乘結果 每一位都互乘 存入對應的位置 for(int j=1;j<=n2[0];j++){ ans[i+j-1]+=n1[i]*n2[j]; } } for(int i=1;i<=ans[0];i++) { if(ans[i]>9){ ans[i+1]+=ans[i]/10; ans[i]%=10; if(i == ans[0]){ ans[0]++; } } } for(int i=ans[0];i>0;i--){ cout<<ans[i]; } return 0; }

在這裡插入圖片描述