zoukankan      html  css  js  c++  java
  • 用字符串解决加减乘除解决不够位

    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时+不出今朝输出字符串,终局为负时输出字符串最左边位置为-。

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

  • 相关阅读:
    VMWare中Red Hat Enterprise Linux 6与Windows XP共享文件夹/共享目录
    PetShop 4.0的数据库
    Eclipse安装Perl插件
    安装GCC for Red Hat Enterprise Linux Server release 6(64位)
    下载 Microsoft .NET Pet Shop 4.0
    一步一步安装 Microsoft .NET Pet Shop 4.0
    Visual Studio 2008安装ASP.NET MVC 2 RTM
    HTML标签大全(常用)
    换了个公司
    Counterfeit Dollar(poj1013暴力枚举)
  • 原文地址:https://www.cnblogs.com/byfei/p/3112371.html
Copyright © 2011-2022 走看看