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; }
  • 相关阅读:
    微信机器人开发SDK使用教程--清粉任务
    微信机器人开发SDK使用教程--养号任务停止
    linux和 unix 介绍
    thinkphp5.1学习笔记
    nginx的相关配置记录和总结
    php优秀框架codeigniter学习系列——CI_URI类学习
    求职过程中的灵感
    设计模式学习系列——过滤器模式
    php优秀框架codeigniter学习系列——CI_Utf8类
    php优秀框架codeigniter学习系列——hooks
  • 原文地址:https://www.cnblogs.com/yeanzhi/p/3121511.html
Copyright © 2011-2022 走看看