大数问题

                       大数问题
大数是指计算的数值非常大或者对运算的精度要求非常高,用已知的数据类型无法精确表示的数值。
例如求Fibonacci数列的第1000个数。
例计算 到小数点后第2000位。
计算大数的一般方法是用数组模拟大数的运算,开一个比较大的整型(或双精度类型)数组,数组的元素代表大数的某一位,通过数组元素的运算模拟大数的运算,最后将代表大数的数组输出。
常用的大数算法有如下几种类型:
大数的加减;
大数的乘;
超大数的乘积;
任意高精度计算。

整数探究
输入:
输入最多100行,每行一个超长整数。
每个整数最多100位。
没有负数输入。
最后输入0结束。
输出:
输出所有输入超长整数的和。
输入样例:
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
0
输出样例:
370370367037037036703703703670
程序代码:
#include<iostream>
#include<fstream>
#include<vector>
#include<string>
using namespace std;
void main()
{
    ifstream stream("input.txt");
    vector<int>v1,v2;
    int f=1,g=0;
 char str[100];
 memset(str,0,sizeof(str));
 stream>>str;
 while(!stream.eof())
 {
     if(str!="0")
  { 
           
         if(f==1)
   {
      for(int i=0;i<100;i++)
      {  
       if(str[i]!='/0')
       {   
        char c=str[i];
        int b=atoi(&c);
      
        v1.push_back(b);f=2;
       }
       else{ break; }
      }
      g++;
   }
   else
   {
       for(int i=0;i<100;i++)
    {
            if(str[i]!='/0')
      {  
       char c=str[i];
       int b=atoi(&c);
       v2.push_back(b);
      }
      else{ break; }
    }
       g++;
   }
            if(g==1)
   {
    memset(str,0,sizeof(str));
    stream>>str;continue;
   }
   else
   {
       int smallsize,bigsize;
          if(v1.size()>=v2.size())
    {
           smallsize=v2.size()-1;
           bigsize=v1.size()-1;
           int middle=0,i=bigsize;
           for(i;i>=0;i--)
     {
     // cout<<v1[i]<<"  "<<v2[smallsize]<<"  ";
                  int temp=middle;
      if(smallsize>=0)
      {
          middle=(v1[i]+v2[smallsize]+middle)/10;
                            v1[i]=(v1[i]+v2[smallsize]+temp)%10;
               // cout<<middle<<"  "<<v2[smallsize]<<endl;
          smallsize--;
      }
      else
      {
          middle=(v1[i]+middle)/10;
       if(middle==0){ v1[i]+=temp;break;}
       else{ v1[i]=(v1[i]+temp)%10; }
      }
           
     }
                    if(i<0&&middle==1){ v1.insert(v1.begin(),1); }
     f=2;
    /* for(int d=0;d<v1.size();d++)
     {  cout<<v1[d];}
                    cout<<endl;*/
           v2.clear();
    }
          else
    { 
           smallsize=v1.size()-1;
           bigsize=v2.size()-1;
           int middle=0,i=bigsize;
           for(i;i>=0;i--)
     {
                  int temp=middle;
      //cout<<v2[i]<<"  "<<v1[smallsize]<<"  ";
      if(smallsize>=0)
      {
          middle=(v2[i]+v1[smallsize]+middle)/10;
                            v2[i]=(v2[i]+v1[smallsize]+temp)%10;
               // cout<<middle<<"  "<<v2[smallsize]<<endl;
          smallsize--;
      }
      else
      {
          middle=(v2[i]+middle)/10;
       if(middle==0){ v2[i]+=temp;break;}
       else{ v2[i]=(v2[i]+temp)%10; }
      }
         }
     if(i<0&&middle==1)
     {
                        v2.insert(v2.begin(),1);
     }
     f=1;
     
     /*for(int d=0;d<v1.size();d++)
     {  cout<<v1[d];}
     cout<<endl;*/
                    v1.clear();
    }
   }
   memset(str,0,sizeof(str));
   stream>>str;
  }//if str
  else{ break;}
 }//while
    if(g==0){ cout<<"0"<<endl; }
 else
 {
  if(f==1)
  {
         for(int j=0;j<v2.size();j++)
   {
         cout<<v2[j];
   }
      cout<<endl;
  }
    else
    {
        for(int j=0;j<v1.size();j++)
     {
         cout<<v1[j];
     }
       cout<<endl;
    }
 }//else g
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值