高精计算

杂题 专栏收录该内容
2 篇文章 0 订阅

 

高精计算
编写一个以字符串为基础进行整数加法的一个程序。这个整数包含符号位,总长不超过255位(因为某些语言的字符串有长度限制)。

输入文件格式:两行,每行为一个长度不超过255的十进制数。可以是负的,负号算一位,既负数的数字部分不超过254位。
in.txt
输出文件格式:一行,得数。
out.txt

#include < fstream >
#include
< vector >
#include
< string >
#include
< iostream >
using   namespace  std;

int  main()
{
     ifstream infile(
"in.txt");
     ofstream outfile(
"out.txt");
     
string s1,s2;
     getline(infile,s1);
     getline(infile,s2);
     
string::iterator s_iter1(s1.begin()),s_iter2(s2.begin());
     
int len,sign1(1),sign2(1),sign_ans(1);
     
if (*s_iter1=='-'){
         sign1
=-1;
         s1.erase(s_iter1);
         }

     
if (*s_iter2=='-'){
         sign2
=-1;
         s2.erase(s_iter2);
         }

     
if (s1.size()>s2.size())
         len
=s1.size();
     
else
         len
=s2.size();
     vector
<int> ans(len+1,0),ivec1(len,0),ivec2(len,0);
     vector
<int>::reverse_iterator r_iter1(ivec1.rbegin()+len-s1.size()),r_iter2(ivec2.rbegin()+len-s2.size()),r_iter_ans(ans.rbegin());
     vector
<int>::iterator iter1(ivec1.begin()),iter2(ivec2.begin()),iter_ans(ans.begin());
     
     
if (sign1==1)
         
for (int i=0;i!=s1.size();++i,++r_iter1)
             
*r_iter1=s1[i]-'0';
     
else
         
for (int i=0;i!=s1.size();++i,++r_iter1)
             
*r_iter1='0'-s1[i];

     
if (sign2==1)
         
for (int i=0;i!=s2.size();++i,++r_iter2)
             
*r_iter2=s2[i]-'0';
     
else
         
for (int i=0;i!=s2.size();++i,++r_iter2)
             
*r_iter2='0'-s2[i];

     
for (int i=0;i!=len;++i,++iter1,++iter2,++iter_ans)
         
*iter_ans=*iter1+*iter2;
     
if (*(iter_ans-1)<0){
         outfile
<<"-";
         iter_ans
=ans.begin();
         
for (int i=0;i!=len;++iter_ans,++i)
             
*iter_ans=-*iter_ans;
         }

     iter_ans
=ans.begin();
     
for (int i=0;i!=len;++iter_ans,++i)
         
if (*iter_ans>0){
             
*(iter_ans+1)+=*iter_ans/10;
             
*iter_ans=*iter_ans%10;
             }

         
else if (*iter_ans!=0){
                  
--*(iter_ans+1);
                  
*iter_ans+=10;
                  }


     
for (;r_iter_ans!=ans.rend();++r_iter_ans)
         
if ((sign_ans==1)&&(*r_iter_ans==0))
             
continue;
         
else{
              sign_ans
=0;
              outfile
<<*r_iter_ans;
              }


     infile.close();
     outfile.close();
     
return 0;
}

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值