zoukankan      html  css  js  c++  java
  • 【hdoj_1753】大明A+B(大数)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1753


    本题要求是,进行多位的小数加法,由于位数很多,所以不能用double类型存储,可以用字符串存储,然后模拟小数的计算过程.通过一个例子,说明一下我的解题思路:


    例如,计算1.2345 + 678.9,思路如下:


    去掉小数点之前,记录小数点的位置,当做整数相加的结果,根据小数点的位置,按照小数的形式输出.

    C++代码如下:

    #include<iostream>
    #include<string>
    using namespace std;
    
    #define max(a,b) (a>b?a:b)
    
    int main()
    {
    	string s1,s2;
    	while(cin>>s1>>s2)
    	{
    		int i,j;
    		int len_1 = s1.length();
    		int len_2 = s2.length();
    
    		for(i=0;i<len_1;i++)
    			if(s1[i]=='.')
    				break;
    		int int_len_1 = i;//s1的整数位长度
    		int decimal_len_1 = len_1 - int_len_1 - 1;//s1的小数位长度
    
    		for(i=0;i<len_2;i++)
    			if(s2[i]=='.')
    				break;
    		int int_len_2 = i;//s2的整数位长度
    		int decimal_len_2 = len_2 - int_len_2 - 1;//s2的小数位长度
    
    		//补齐整数位,使s1和s2的整数位对齐
    		if(int_len_1<int_len_2)
    			for(i=1;i<=int_len_2-int_len_1;i++)
    			s1 = '0' + s1;
    		else if(int_len_2<int_len_1)
    			for(i=1;i<=int_len_1-int_len_2;i++)
    				s2 = '0' + s2;
    		
    		//在s1和s2的前面多加1位0,因为例如:2.6+7.5 = 10.1整数位数变多了.
    		s1 = '0' + s1;
    		s2 = '0' + s2;
    
    		//补齐小数位,使s1和s2小数位对齐
    		if(decimal_len_1<decimal_len_2)
    			for(i=1;i<=decimal_len_2-decimal_len_1;i++)
    			s1 = s1 + '0';
    		else if(decimal_len_2<decimal_len_1)
    			for(i=1;i<=decimal_len_1-decimal_len_2;i++)
    				s2 = s2 + '0';
    
    		int node = max(int_len_1,int_len_2)+1;//小数点的下标
    		
    		//去掉小数点
    		s1 = s1.erase(node,1);
    		s2 = s2.erase(node,1);
    
    		//下面,可以将s1和s2进行整数加法计算.
    		//模拟"整数"s1和s2的加法过程,结果存在s1中
    		int len = s1.length();
    		int c = 0;
    		for(i=len-1;i>=0;i--)
    		{
    			int x = s1[i] - '0';//将s1的某个字符转化为字符对应的数字
    			int y = s2[i] - '0';
    
    			c += (x+y);
    			s1[i] = (c % 10 + '0');//注意 +'0'是将数字 c%10 转化为对应的字符
    			
    			c /= 10;
    		}
    		
    		//至此,计算完毕,下面是输出过程.
    		
    		for(i=0;i<len;i++)
    			if(s1[i]!='0')//从非零的整数位开始输出
    				break;
    		for(j=i;j<node;j++)
    			cout << s1[j];//输出整数位
    		
    		for(j=len-1;j>=node;j--)//看看小数为是否都为0
    			if(s1[j]!='0')
    				break;
    		if(j>=node)//在这种情况下,小数为不全为0
    		{
    			cout << ".";//输出小数点
    			for(i=node;i<=j;i++)
    				cout << s1[i];//输出小数位
    		}
    
    		cout << endl;
    	}
    
    	return 0;
    }
    上述代码,提交可以通过.

  • 相关阅读:
    使用createDocumentFragment的渲染数据(节省性能)
    面向对象写法模板
    面向对象this指向
    js 3D图片叠加旋转切换
    三列布局-中间固定俩边自适应-和两边固定中间自适应布局
    游戏中抽奖的算法
    c++11:lambda表达式
    c++11:模板
    c++11:左值、右值
    游戏服务器语言之争
  • 原文地址:https://www.cnblogs.com/tensory/p/6590748.html
Copyright © 2011-2022 走看看