程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 字符串的加減乘除解決不夠位的情況

字符串的加減乘除解決不夠位的情況

編輯:C++入門知識

1.在計算機中,由於位寬限制,只能進行有限精度的十進制整數加減法,比如在32位寬計算機中,參與運算的操作數和結果必須
在-231~231-1之間。若是需要進行更大規模的十進制整數加法,需要使用特殊的方法實現,比如使用字符串保存操作數和結果,采
納逐位運算的方式進行。如下:9876543210 + 1234567890 = ?,讓字符串 num1="9876543210",字符串 num2="1234567890",結果
保存在字符串 result = "11111111100"。-9876543210 + (-1234567890) = ?讓字符串 num1="-9876543210",字符串 num2="-
1234567890",終局保存在字符串 result = "-11111111100"。
要求編程實現上述高精度的十進制加法。
要求實現函數:
void add (const char *num1, const char *num2, char *result)
輸入:num1:字符串形式操作數1,若是操作數為負,則num1[0]為符號位-
num2:字符串形式操作數2,若是操作數為負,則num2[0]為符號位-
輸出:result:保存加法計較終局字符串,若是終局為負,則result[0]為符號位。
當輸入為正數時,+不會出今朝輸入字符串中;當輸入為負數時,-會出今朝輸入字符串中,且必然在輸入字符串最左邊位置
輸入字符串所有位均代表有效數字,即不存在由0起頭的輸入字符串,比如"0012", "-0012"不會呈現;
要求輸出字符串所有位均為有效數字,終局為正或0時+不出今朝輸出字符串,終局為負時輸出字符串最左邊位置為-。

[cpp]
#include <string> 
#include <iostream> 
#include <stdlib.h> 
#include <map> 
using namespace std; 
 
map <char,int> char2int; 
map <int,char> int2char; 
void Init() 

    for(int i = 0;i<10;i++) 
    { 
        char CData = (char)(i+48); 
        char2int[CData] = i; 
        int2char[i] = CData; 
    } 

 
char * Reverse(const char *strStc,char*strDest) 

    int nLen = strlen(strStc); 
    int i = 0; 
    for(nLen;0 <= nLen;nLen--) 
    { 
        strDest[i]= strStc[nLen-1]; 
        i++; 
    } 
    strDest[i]='\0'; 
    return strDest; 

 
void add (const char *num1, const char *num2, char *result) 

    int nLenNum1 = strlen(num1); 
    int nLenNum2 = strlen(num2); 
    char ReverseNum1 [100] ={'0'}; 
    char ReverseNum2 [100] ={'0'}; 
    char ReverseResult [100] = {'0'}; 
    Reverse(num1,ReverseNum1); 
    Reverse(num2,ReverseNum2); 
    int nLen = nLenNum1 > nLenNum2 ? nLenNum1:nLenNum2; 
    for(int i=0;i<nLen;i++) 
    { 
        int nResult = char2int[ReverseNum1[i]] + char2int[ReverseNum2[i]]  
        + char2int[result[i]]; 
        result[i] = int2char[nResult%10]; 
        result[i+1] = int2char[nResult/10]; 
    } 
    strcpy(ReverseResult,result); 
    Reverse(ReverseResult,result); 
 

 
int main() 

    Init(); 
    char * num1="9876543210"; 
    char * num2="1234567890"; 
    char result [100] = {'0'}; 
    add(num1,num2,result); 
    cout<<result<<endl; 
    getchar(); 
    return 0; 


2、輸入二個64位的十進制數,計算相乘之後的乘積。
答:以下代碼為網上別人貼出的,輸入任意位數十進制數(包括小數,負數)都可以得出正確結果。
思路是:將大數當作字符串進行處理,也就是將大數用10進制字符數組進行表示,然後模擬人們手工進行“豎式計算”的過程編寫乘法。

[cpp]
#include <iostream> 
using namespace std; 
#define MAX 100 
int str_num(char str[]) //計算字符串的長度,等效於strlen(str); 

    int i=0,num_str=0; 
    while(str[i]!=0) 
    { 
        num_str++; 
        i++; 
    } 
    return num_str; 

void place(int num_str,char str[]) //將字符串高低顛倒。 

    int temp=0,i=0,j=0; 
    for(i=0,j=num_str-1;i<j;i++,j--) 
    { 
        temp=str[j]; 
        str[j]=str[i]; 
        str[i]=temp; 
    } 

void transition(unsigned int a[],char str1[]) //數字字符轉化為數字。 

    int i=0; 
    while(str1[i]!=0) 
    { 
        a[i]=str1[i]-'0'; 
        i++; 
    } 

void multiply_int(unsigned int a[],unsigned int b[],unsigned int c[]) //大數相乘算法,入口為整形數組。 

    int i=0,j=0; 
    for(i=0;i<MAX;i++) 
    { 
        for(j=0;j<MAX;j++) 
        { 
            c[i+j]+=a[i]*b[j]; 
            c[i+j+1]+=c[i+j]/10; 
            c[i+j]%=10; 
        } 
    } 

void output(int sign,unsigned int c[],int quan) //數據輸出。 

    int sign_temp=0,i=0; 
    cout<<"The result is: "; 
    if(sign==1) 
        cout<<"-"; 
    for(i=MAX-1;i>-1;i--) 
    { 
        if(sign_temp==0) 
        { 
            if(c[i]!=0) 
                sign_temp=1; 
        } 
        if(sign_temp==1) 
        { 
            if(i==quan-1) 
                cout<<"."; 
            cout<<c[i]; 
            c[i]=0; 
        } 
    } 
    cout<<endl; 

void multiply_string(char str1[],char str2[],unsigned int c[]) //大數相乘,入口為字符串。 

    unsigned int a[MAX]={0},b[MAX]={0}; 
    int sign=0; 
    transition(a,str1); 
    transition(b,str2); 
    multiply_int(a,b,c); 

int sign_comp(char str1[],char str2[]) //符號判斷,如果為負數將作相應處理。 

    int i=0,sign_num=0; 
    if(str1[0]=='-') 
    { 
        sign_num=!sign_num; 
        for(i=0;i<MAX-1;i++) 
            str1[i]=str1[i+1]; 
    } 
    if(str2[0]=='-') 
    { 
        sign_num=!sign_num; 
        for(i=0;i<MAX-1;i++) 
            str2[i]=str2[i+1]; 
    } 
    return sign_num; 

int format(char str[]) //將輸入的字符串進行格式化。以得到字符的一些標志信息和相應格式的新數據串。 

    int point=0,quan=0,i=0,j,k=0,sign_point=0,num_str=0; 
    num_str=str_num(str); 
    while(str[i]!=0) 
    { 
        if(str[i]<'0'||str[i]>'9') 
        { 
            if(str[i]!='.') 
            { 
                cout<<"data error"<<endl; 
                return(-1); 
            } 
            else 
            { 
                point++; 
                sign_point=i; 
            } 
        } 
        if(point>1) 
        { 
            cout<<"data error"<<endl; 
            return(-1); 
        } 
        i++; 
    } 
    if(point==1) 
    { 
        for(j=sign_point;j<num_str;j++) 
            str[j]=str[j+1]; 
        num_str--; 
        quan=num_str-sign_point; 
    } 
    place(num_str,str); 
    return quan; 

void clear(char str[]) //清空函數。 

    int i; 
    for(i=0;i<MAX;i++) 
    { 
        str[i]=0; 
    } 

 
void main(void)  

    char str1[MAX]={0}; 
    char str2[MAX]={0}; 
    int quan1=0; 
    int quan2=0; 
    int sign=0; //0表示結果是整數,1表示結果是負數 
    unsigned int c[MAX*2+1]={0}; 
    while(true) 
    { 
        cout<<"Please input the first number:"; 
        cin>>str1; 
        cout<<"Please input the second number:"; 
        cin>>str2; 
        sign=sign_comp(str1,str2); 
        quan1=format(str1); 
        quan2=format(str2); 
        if(quan1==-1||quan2==-1) 
        {  
            clear(str1); 
            clear(str2); 
        } 
        if(quan1!=-1 && quan2!=-1 && str1[0]!=0 && str2[0]!=0) 
         break; 
    } 
    multiply_string(str1,str2,c); 
    output(sign,c,quan1+quan2); 
    system("pause"); 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved