1. 程式人生 > >c/c++實現大數相加相減相乘

c/c++實現大數相加相減相乘

題目描述:

用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;
}

測試: