返回顶部

收藏

C语言字符串的加减乘除解决不够位的情况

更多
#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进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程编写乘法。

#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");
}

标签:四则运算,字符串,C语言

收藏

0人收藏

支持

0

反对

0

发表评论