当前位置:编程学习 > 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) 
           &nbs

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,