zoukankan      html  css  js  c++  java
  • 《信息学奥赛一本通》 高精度加法。输入两个正整数,求它们的和。

    高精度加法。输入两个正整数,求它们的和。

    算法分析

    输入两个数到两个变量中,然后用赋值语句求它们的和,输出。但是,我们知道,在C++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,上述算法显然不能求出精确解,因此我们需要寻求另外一种方法。在读小学时,我们做加法都采用竖式方法,这样我们方便写出两个整数相加的算法。
    an……a3 a2 a1
    bn……b3 b2 b1
    +————————
    cn……c3 c2 c1
    我们用数组a、b分别存储加数和被加数,用数组c存储结果。

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int main ()
    {
     char a1[100],b1[100];
     int a[100],b[100],c[100],lena,lenb,lenc,i,x;
     memset(a,0,sizeof(a));
     memset(b,0,sizeof(b));
     memset(c,0,sizeof(c));
     gets(a1);
     gets(b1);
     //输入加数和被加数
     lena=strlen(a1);
     lenb=strlen(b1);
     for(i=0;i<=lena-1;i++)
     {//把加数放入a数组
      a[lena-i]=a1[i]-48;                     //思考:为什么要-48?
     }
     for(i=0;i<=lenb-1;i++)
     {//把加数放入b数组
      b[lenb-i]=b1[i]-48;                     //思考:为什么要-48?
     }
     lenc=1;x=0;
     while(lenc<=lena||lenc<=lenb)
     {
      c[lenc]=a[lenc]+b[lenc]+x;
      //两数相加
      x=c[lenc]/10;
      c[lenc]%=10;
      lenc++;
     }
     c[lenc]=x;
     if(c[lenc]==0)
     {//处理最高位
      lenc--;
     }
     for(i=lenc;i>=1;i--)
     {//输出结果
      cout<<c[i];
     }
     cout<<endl;
     return 0;
    }
    

    升级版代码

    #include <iostream>
    #include <cstring>
    #include <string>
    using namespace std;
    int main ()
    {
    	string a1,b1;
    	bool temp=true;
    	int a[100],b[100],c[100],lenc=1,x=0;
    	memset(a,0,sizeof(a));
    	memset(b,0,sizeof(b));
    	memset(c,0,sizeof(c));
    	cin>>a1>>b1;
    	for(int i=0;i<=a1.length()-1;i++) a[a1.length()-i]=a1[i]-'0';
    	for(int i=0;i<=b1.length()-1;i++) b[b1.length()-i]=b1[i]-'0';
    	while(lenc<=a1.length()||lenc<=b1.length())
    	{
    		c[lenc]=a[lenc]+b[lenc]+x;
    		x=c[lenc]/10;
    		c[lenc]%=10;
    		lenc++;
    	}
    	c[lenc]=x;
    	for(int i=lenc;i>=1;i--)
    	{
    		if(c[i]==0&&temp) continue;
    		else temp=false;
    		cout<<c[i];
    	}
    	if(c[1]==0) cout<<0<<endl;
    	cout<<endl;
    	return 0;
    }
    
  • 相关阅读:
    OpenCV笔记——cvFloodFill漫水填充算法
    C# 总结 随笔
    MYSQL存储过程 随笔
    MYSQL总结 随笔
    xPath 总结 随笔
    Javascript 总结 随笔
    linux中top查看cpu使用率超过100%
    页面优化小记1
    基于数据库的多语言解决方案
    基于消息队列的日志组件
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12339612.html
Copyright © 2011-2022 走看看