zoukankan      html  css  js  c++  java
  • 大整数乘法,学数据结构之后对于小学期大数运算的改进

    先说一下一会要使用的头文件#include <cstdio>的构造。在C语言中,stdio.h 头文件是主要的。而在后来的C++语言中,C只是C++的一个子集,且C++中,已不推荐再用C的类库,但为了对已有代码的保护,还是对原来的头文件支持。

       cstdio是c++从C的stdio.h继承来的,在前面加C同时不要H后缀,在C++环境当然是选用前者,两者内容都一样,只是cstdio头文件中定义的名字被定义在命名空间std中。使用后者就会带来额外的负担,需要区分哪些是标准库明是C++特有的,哪些是继承过来的,下面是 cstdio核心作用的代码声明。你可以使用以下的方法。

    using ::size_t; using ::fpos_t; using ::FILE;
    using ::clearerr; using ::fclose; using ::feof;
    using ::ferror; using ::fflush; using ::fgetc;
    using ::fgetpos; using ::fgets; using ::fopen;
    using ::fprintf; using ::fputc; using ::fputs;
    using ::fread; using ::freopen; using ::fscanf;
    using ::fseek; using ::fsetpos; using ::ftell;
    using ::fwrite; using ::getc; using ::getchar;
    using ::gets; using ::perror;
    using ::putc; using ::putchar;
    using ::printf; using ::puts; using ::remove;
    using ::rename; using ::rewind; using ::scanf;
    using ::setbuf; using ::setvbuf; using ::sprintf;
    using ::sscanf; using ::tmpfile; using ::tmpnam;
    using ::ungetc; using ::vfprintf; using ::vprintf;
    using ::vsprintf;#include <cstring>

    以下下是程序

    #include <cstdio>
    #include <iostream>
    #include <cmath>
    using namespace std;
    char anum[1100],bnum[1100],ans[1100];
    int cs,i,j,len,t;
    void swap(char &a,char &b){
    char temp=a;a=b;b=temp;
    }
    ///非负大整数乘法,时间复杂度为(2*len)^2,空间复杂度为2*len
    void mxmult(char *num1,char *num2,char *tans)
    {
      int len1=strlen(num1);
      int len2=strlen(num2);
      int mx=max(len1,len2);mx*=2;///初始化num1把它的长度变为2倍
      for(i=0,j=len1-1; i<j; i++,j--) swap(num1[i],num1[j]);
      for(i=0;i<len1; i++) num1[i]-='0';
      for(i=len1; i<mx; i++) num1[i]=0;
    
      len2=strlen(num2);///初始化num2把它的长度变为2倍
      for(i=0,j=len2-1; i<j; i++,j--) swap(num2[i],num2[j]);
      for(i=0;i<len2;i++) num2[i]-='0';
      for(i=len2; i<mx; i++) num2[i]=0;
    
      len=mx;
      for(i=0;i<len;i++)///求乘积
      {
        for(j=0;j<=i;j++)
        {
          t+=num2[j]*num1[i-j];
        }
        tans[i]=t%10+'0';
        t/=10;
      }
      i--;
      while(tans[i]=='0') 
        i--;///处理前导零   if(i<0)
      {
        tans[0]='0';
        i=0;
      }   tans[i
    +1]='\0';   for(j=0;j<i;j++,i--)
        swap(tans[i],tans[j]); }
    int main() {
      while(scanf("%s%s",anum,bnum))//这么写比cin输入方便这就是要用#include <cstdio>的原因 { mxmult(anum,bnum,ans);   cout<<ans; } return 0; }
  • 相关阅读:
    单例
    淘宝在数据处理领域的项目及开源产品介绍 | 岭南六少
    数据库垂直拆分,水平拆分利器,cobar升级版mycat
    基于Gtid的mysql主从复制 和 mysql-proxy 读写分离
    几行lua代码计算http包总长度_指甲锉_新浪博客
    使用Lua和OpenResty搭建验证码服务器
    测试比json更快更小的二进制数据传输格式Msgpack [pythono MessagePack 版本]
    使用 HAProxy, PHP, Redis 和 MySQL 轻松构建每周上亿请求Web站点
    nginx+lua+redis实现验证码防采集
    OpenResty(Nginx)+Lua+GraphicsMagick实现缩略图功能 | 琥珀志
  • 原文地址:https://www.cnblogs.com/yeanzhi/p/3121511.html
Copyright © 2011-2022 走看看