大数模板

来源:互联网 发布:python 推荐算法包 编辑:程序博客网 时间:2024/05/22 12:53

数据太大,用手工模拟加法

#include <stdio.h>#include <string.h>int main( ) {    char a[1000], b[1000], c[1001] = {0}, flag = 0;  /*c:存放结果,flag:进位信息*/    int i, j, k, m, n, len; /*i:跟踪a的下标,j:跟踪b的下标,k:跟踪c的下标*/    scanf("%s%s", a, b);    m = strlen(a);    n = strlen(b);    len = (m > n) ? m : n;    /*相加时,先将右边对齐,即将i指向a的右端,j指向b的右端,    然后i、j对齐,同步向左移动,直到其中一个到头为止*/    for(i = m - 1, j = n - 1, k = len - 1; i >= 0 && j >= 0; i--, j--, k--)    {        c[k] = (a[i] - '0' + b[j] - '0' + flag) % 10 + '0';        flag = (a[i] - '0' + b[j] - '0' + flag) / 10;    }    for(; i >= 0; i--, k--)  /*若a更长,即a没有处理完,处理a剩下的高位部分*/    {        c[k] = (a[i] - '0' + flag) % 10 + '0';        flag = (a[i] - '0' + flag) / 10;    }    for(; j >= 0; j--, k--)  /*若b更长,则方法同上*/    {        c[k] = (b[j] - '0' + flag) % 10 + '0';        flag = (b[j] - '0' + flag) / 10;    }    if(flag != 0) /*若最终的最高位进位信息不为0*/    {        for(k = len; k > 0; k--)             c[k] = c[k - 1];        c[0] = flag + '0';    }    printf("%s + %s = %s\n", a, b, c);    return 0;}

来一发大数模板:

string dashu(string x,string y){    string s;    reverse(x.begin(),x.end());    reverse(y.begin(),y.end());    int i=0;    int m,k=0;    while(x[i]&&y[i])    {        m=x[i]-'0'+y[i]-'0'+k;        k=m/10;        s+=(m%10+'0');        i++;    }    if(i==x.size())    {        while(i!=y.size())        {            m=k+y[i]-'0';            k=m/10;            s+=m%10+'0';            i++;        }        if(k)            s+=k+'0';    }    else if(i==y.size())    {        while(i!=x.size())        {            m=k+x[i]-'0';            k=m/10;            s+=m%10+'0';            i++;        }        if(k)            s+=k+'0';    }    reverse(s.begin(),s.end());    return s;}

-----------------存一发各类大数模板----------------------------------------------

1.大数加法 

string sum(string s1,string s2)  {      if(s1.length()<s2.length())      {          string temp=s1;          s1=s2;          s2=temp;      }      int i,j;      for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)      {          s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));   //注意细节          if(s1[i]-'0'>=10)          {              s1[i]=char((s1[i]-'0')%10+'0');              if(i) s1[i-1]++;              else s1='1'+s1;          }      }      return s1;  }  

2.大数乘以整形数

string Multiply(string s,int x)  //大数乘以整形数  {      reverse(s.begin(),s.end());      int cmp=0;      for(int i=0;i<s.size();i++)      {          cmp=(s[i]-'0')*x+cmp;          s[i]=(cmp%10+'0');          cmp/=10;      }      while(cmp)      {          s+=(cmp%10+'0');          cmp/=10;      }      reverse(s.begin(),s.end());      return s;  }  
3.大数除以整形数

string Except(string s,int x)  //大数除以整形数  {      int cmp=0,ok=0;      string ans="";      for(int i=0;i<s.size();i++)      {          cmp=(cmp*10+s[i]-'0');          if(cmp>=x)          {              ok=1;              ans+=(cmp/x+'0');              cmp%=x;          }          else{              if(ok==1)                  ans+='0';  //注意这里啊。才找出错误          }      }      return ans;  }  
4.大数乘法

string sum(string s1,string s2)  //大数加法  {      if(s1.length()<s2.length())      {          string temp=s1;          s1=s2;          s2=temp;      }      int i,j;      for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)      {          s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));   //注意细节          if(s1[i]-'0'>=10)          {              s1[i]=char((s1[i]-'0')%10+'0');              if(i) s1[i-1]++;              else s1='1'+s1;          }      }      return s1;  }    string Mult(string s,int x)  //大数乘以整形数  {      reverse(s.begin(),s.end());      int cmp=0;      for(int i=0;i<s.size();i++)      {          cmp=(s[i]-'0')*x+cmp;          s[i]=(cmp%10+'0');          cmp/=10;      }      while(cmp)      {          s+=(cmp%10+'0');          cmp/=10;      }      reverse(s.begin(),s.end());      return s;  }  string Multfa(string x,string y)  //大数乘法  {      string ans;      for(int i=y.size()-1,j=0;i>=0;i--,j++)      {          string tmp=Mult(x,y[i]-'0');          for(int k=0;k<j;k++)              tmp+='0';          ans=sum(ans,tmp);      }      return ans;  }  
5.浮点数的n次方

string Multiply(string s,long x)  //大数乘以整形数  {      reverse(s.begin(),s.end());      long cmp=0;      for(int i=0; i<s.size(); i++)      {          cmp=(s[i]-'0')*x+cmp;          s[i]=(cmp%10+'0');          cmp/=10;      }      while(cmp)      {          s+=(cmp%10+'0');          cmp/=10;      }      reverse(s.begin(),s.end());      return s;  }  string Remove_later(string s)   //删除一个字符串的后倒0  {      int ok=1;      for(int i=s.size()-1; i>=0; i--)      {          if(s[i]=='0'){              s.erase(i);          }          else if(s[i]=='.')          {              s.erase(i);              ok=0;          }          else              ok=0;          if(ok==0)              break;      }      return s;  }  string factorial(string s,int n)   //浮点数的n次方  {      if(n==0)          return "1";      string cmp="",count="";      long x=0,point=0;      for(int i=0; i<s.size(); i++)          if(s[i]!='.')          {              cmp+=s[i];              x=x*10+(s[i]-'0');          }          else              point=s.size()-1-i;      for(int i=1; i<n; i++)      {          cmp=Multiply(cmp,x);      }      int ans_point=cmp.size()-n*point;      if(ans_point<0)      {          count+='.';          for(int i=ans_point; i!=0; i++)              count+='0';      }      string::iterator it=cmp.begin();      if(ans_point>=0&&ans_point<cmp.size())          cmp.insert(it+ans_point,'.');      count+=(Remove_later(cmp));      return count;  }  



参考:http://blog.csdn.net/y990041769/article/details/20116995





2 0
原创粉丝点击