c/c++實現大數相加相減相乘
阿新 • • 發佈:2018-11-13
題目描述:
用26個字母實現26進位制數相加,'a'代表0;'z'代表25。
舉例:
輸入:
zzz
zz
輸出:
bazy
程式碼:
#include <iostream> #include <string.h> #include <math.h> using namespace std; int main() { string A,B; int C[1000]; int k,m,n,cnt=0,flag=0; cout << "分別輸入兩個加數" << endl; cin>>A>>B; m = A.size(); n = B.size(); k = max(A.size(),B.size()); for(int i=k-1;i>=0;i--){ //考慮A比B長的情況 if(k==A.size()&&k>B.size()){ if(n>0){ C[i+1] = A[--m]+B[--n]-'a'+cnt; cnt =0; if(C[i+1]>'z'){ C[i+1] = C[i+1]-26; cnt++; } } else{ C[i+1] = A[--m]+cnt; cnt =0; } } //考慮B比A長的情況 else if(k==B.size()&&k>A.size()){ if(m>0){ C[i+1] = A[--m]+B[--n]-'a'+cnt; cnt =0; if(C[i+1]>'z'){ C[i+1] = C[i+1]-26; cnt++; } } else{ C[i+1] = B[--n]+cnt; cnt=0; } } //考慮B和A等長的情況 else if(k==B.size()&&k==A.size()){ C[i+1] = (A[--m]-'a')+B[--n]+cnt; cnt =0; if(C[i+1]>'z'&&i==0){ C[i+1] = C[i+1]-26; C[i] = 'b'; flag = 1; } else if(C[i+1]>'z'){ C[i+1] = C[i+1]-26; cnt++; } } } //考慮進位情況 if(C[1]>'z'){ C[1] = C[1]-26; C[0] = 'b'; flag = 1; } //輸出 if(flag==0){ for(int i=1;i<=k;i++){ cout <<char(C[i]); } } else if(flag==1){ for(int i=0;i<=k;i++){ cout <<char(C[i]); } } return 0; }
測試:
進階(大數相乘):
#include<iostream> #include<string> using namespace std; string BigNumMultiply(string str1,string str2){ //大數相乘,結果要麼m+n位,要麼m+n-1位 int size1=str1.size(),size2=str2.size(); string str(size1+size2,'0'); //定義size1+size2個‘0’ for(int i=size2-1;i>=0;--i){ int mulflag=0,addflag=0; for(int j=size1-1;j>=0;--j){ int temp1=(str2[i]-'0')*(str1[j]-'0')+mulflag; mulflag=temp1/10; temp1=temp1%10; int temp2=str[i+j+1]-'0'+temp1+addflag; str[i+j+1]=temp2%10+48; addflag=temp2/10; } str[i]+=mulflag+addflag; //cout<<str[i]<<endl; } if(str[0]=='0') str=str.substr(1,str.size()); return str; } int main(){ string str1,str2; while(cin>>str1>>str2){ cout<<str1<<"*"<<str2<<"="<<endl; cout<<BigNumMultiply(str1,str2)<<endl; } return 0; }