大整数类的实现(3)(原创)

C++大整数类bigInteger及几个重载运算符 大整数类,重载运算符"<<",">>","!=","+=","+","*",uva424,uva485,uva495,uva324设计大整数类以及几个运算符重载//">>"重载//"<<"重载//"!="重载//"+="重载//"+"重载//"*"重载//uva424主函数//uva495主函数//uva485主函数//uva324主函数 设计大整数... 阅读详情
 本来现在我应该要介绍HugeNumberBase的实现了,但是我不准备在这里介绍。

因为HugeNumberBase的实现是需要详细解说的,可能要花上不久的时间和不少的篇幅,我觉得可能先等我把所有其他“外围”代码都解决完了,再来专心对付这个“核心”会比较好,所以我这里介绍DataAllocation.h和Helper.h的实现。

 

4.DataAllocation.h

——————————————————————————————————

/*
 * Copyright (c) 2005 by DoZerg.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
 */
#pragma once

namespace DoZerg{
//class DataInStack
 template<long N,typename __DataType>
 class DataInStack
 {
 public:
  typedef __DataType * ptr;
  typedef const __DataType * const_ptr;
  operator ptr(){
   return data_;
  }
  operator const_ptr() const{
   return data_;
  }
 private:
  __DataType data_[N];
 };
//class DataInHeap
 template<long N,typename __DataType>
 class DataInHeap
 {
 public:
  typedef __DataType * ptr;
  typedef const __DataType * const_ptr;
  DataInHeap():data_(new __DataType[N]){
  }
  DataInHeap(const DataInHeap & v):data_(new __DataType[N]){
   FromSelf(v);
  }
  ~DataInHeap(){
   delete [] data_;
  }
  DataInHeap & operator =(const DataInHeap & v){
   FromSelf(v);
   return *this;
  }
  operator ptr(){
   return data_;
  }
  operator const_ptr() const{
   return data_;
  }
 private:
  ptr data_;
  void FromSelf(const DataInHeap & v){
   memcpy(data_,v.data_,N * sizeof(__DataType));
  }
 };
//class DataAutoSelect : with a allocation selection strategy(if N<100 then DataInStack,else DataInHeap)
 template<long N,typename __DataType>
 class DataAutoSelect
 {
 public:
  typedef __DataType * ptr;
  typedef const __DataType * const_ptr;
  operator ptr(){
   return data_;
  }
  operator const_ptr() const{
   return data_;
  }
 private:
  template<bool,class T1,class T2>struct IfType{ typedef T1 RType; };
  template<class T1,class T2>struct IfType<false,T1,T2>{ typedef T2 RType; };
  typedef typename IfType< (N<100),DataInStack<N,__DataType>,DataInHeap<N,__DataType> >::RType RType;
  RType data_;
 };
}//namespace DoZerg

——————————————————————————————————

这里有3个类模版,DataInStack,DataInHeap和DataAutoSelect。

1)DataInStack

这个类模版从栈空间里“申请”数据data_,其实就是这句:

__DataType data_[N];

如果大整数本来是在栈空间里生成的,那么data_自然也在栈空间里了;如果大整数在堆空间里生成,那么data_也会存在于堆空间。

它有2个模版参数:

long N,

typename __DataType

第一个N是数据数组data_的长度,第二个__DataType是数据的类型。

这里用__DataType来抽象内部的数据类型,那么一个128bits的整数,可以用2个long long来表示,也可以用4个long来表示,甚至用16个char来表示。

DataInStack需要提供的接口,或者说“合格”的Alloc应该提供的接口包括:

    默认构造函数

    拷贝构造函数

    拷贝赋值函数

  typedef __DataType * ptr;
  typedef const __DataType * const_ptr;
  operator ptr();

  operator const_ptr() const;

后面几个直接写成代码形式,希望能更清晰。

对于DataInStack,前3个接口使用编译器自动的生成就行了,所以实际上它只提供了后4个接口。

2)DataInHeap

它与DataInStack的本质区别就是只存储data_指针,数据空间是在构造的时候new出来的,所以它的数据永远在堆空间里。考虑到大整数可能占用比较大的内存,把数据空间移到堆里也许能减轻线程栈空间的压力。

由于DataInHeap只存储数据的指针,那么编译器生成的浅拷贝函数就不够用了,所以它实现了一个Alloc应该具有的全部接口。

3)DataAutoSelect

这个类模版是我展示小小“技巧”的一个东西,本来是不需要的。

它的主要作用就是根据数据数组长度N的大小,来选择采用DataInStack还是DataInHeap,这里我的界限是100。如果N<100,将采用DataInStack;否则采用DataInHeap。

它首先实现了作为Alloc接口必须的东西,即public下的所有东西,然后把内部数据的表示进行了“技术处理”(当然还利用了DataInStack和DataInHeap拷贝函数)。

注意到这二行:

template<bool,class T1,class T2>struct IfType{ typedef T1 RType; };

template<class T1,class T2>struct IfType<false,T1,T2>{ typedef T2 RType; };

定义了一个类模版IfType,接受3个模版参数,并把T1定义成RType;

下面对IfType进行了特化,在第一个模版参数为false的情况下,把T2定义成RType;那么前面定义R1为RType的情况只能是第一个模版参数为true了。

于是这样IfType就成了一个类型选择器,根据第一个模版参数进行T1或T2的类型选择。

所以接下来的这行:

typedef typename IfType< (N<100),DataInStack<N,__DataType>,DataInHeap<N,__DataType> >::RType RType;

也就不再“神秘”。

IfType<

    (N<100),

    DataInStack<N,__DataType>,

    DataInHeap<N,__DataType>

>

IfType的第一个模版参数是(N<100),由它决定,最终是DataInStack<N,__DataType>定义成RType,还是DataInHeap<N,__DataType>定义成RType。

然后把这个RType定义成DataAutoSelect的RType。

于是根据N值来选择DataInStack或DataInHeap的目的就达到了。

C++ 实现大整数类运算符重载 018:别叫,这个大整数已经很简化了! 查看 提交 统计 提问 总时间限制:  1000ms   内存限制:  65536kB // 在此处补充你的代码 描述 程序填空,输出指定结果 #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;cstdlib&gt; #include &lt;cs... 阅读详情

相关推荐

c++大整数类的几种实现方法与解析

在oj上做题时,相信大家遇到过很多要求大整数的题目,这时候,我们就需要用到所谓的高精度算法,即用数组来储存整数,模拟四则运算以及其他常见的运算,下面就让我们来分析一下几种实现大整数的方法 一.用vector来储存大整数 #include #include #include #include #include #include using namespace std; class Big

dvt777的博客 1万+

题目总结:大整数计算(运算符重载)

问题描述: #include #include<string.h> #include using namespace std; //用char型数组存整数的整体思路: /* 1.使用一位作为记录符号位,用’0’表示非负数,用’B’表示负数,初始化时将数组除0下标位置的每一位数据都赋为’A’ (注意:有坑,容易想到用’-1’进行表示,但-1并不是单个 char型数据) 2.传入整型...

weixin_42896310的博客 2108

c++ 无符号bigint高精度大整数

此代码除了减法和乘法以外均参考了刘汝佳的《算法竞赛入门经典第二版》,亲测DevC++可以编译通过。代码在codevs( codevs.cn )上通过高精度全部题目。POWERED BY PHANTOM 大神勿喷,希望大家支持!

PHANTOM 7634

HDU 1134 大数取模 使用大数模板

#include #include #include #include using namespace std; char str[1010]; int modd; #define MAXN 9999 #define MAXSIZE 10 #define DLEN 4 class BigNum { private: int a[1010]; //可以控制大数的位数 i

vsooda的专栏 4769

Cadence17.2 > OrCAD Capture CIS > 设计规则检查(Design Rule Check)DRC学习记录详解

选中设计完成的DSN文件,选择Tool->Design Rule Check,弹出下面对话框,详解如下。 一、Design Rule Check对话框选项详解 Design Rules Options tab Set the scope, mode and type of design rule (electrical and / or physical) test options for the design rules check. 为

DL_62532的专栏 1万+

hcaptcha逆向实战:从API解析到参数构造的完整链路

本文详细拆解了hcaptcha验证码的逆向实战流程,从环境准备、捕获API与版本号,到解析核心加密逻辑hsw.js,再到构造getcaptcha请求参数,最后完成验证提交。文章重点剖析了motionData、n、c等关键参数的获取与构造方法,为开发者模拟浏览器行为、实现自动化验证提供了清晰的完整链路指南。

ik678901的博客 630

C++ 高精度整数,求n的阶乘(n!),大数乘小数如何处理

附代码: // // 61.cpp // N的阶乘 // // Created by chenmeiqi on 2019/3/31. // Copyright © 2019年 chenmeiqi. All rights reserved. // #include <iostream> #include <cmath> using namespace std...

Maggie的博客 3353

实战分享:一文读懂RS-232总线

RS-232标准接口(又称EIARS-232)是常用的串行通信接口标准之一,它是由美国电子工业协会(Electronic IndustryAssociation,EIA)联合贝尔系统公司、调制解调器厂家及计算机终端生产厂家于1970年共同制定,其全名是“数据终端设备(DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。

阿荣嵌入式 8520

大整数类的实现(7)(原创)

3)————————————————————————————————————————————————    templateclass __Alloc>        HugeNumberBase & HugeNumberBase::RightShift(){            for(long i=N-1;i>0;--i)                data_[i]=(data_

daidodo的专栏 853

半导体领域知识 - 初级入门

半导体领域知识 - 初级入门 知识问答 1. 一个晶圆上根据芯片的大小,可以生产几百、几千、几万个芯片。如下图: 2. 8寸晶圆指的是什么?5nm工艺指的是什么? 8寸晶圆指的是直径为175mm(17.5cm)的晶圆,下面是6/812/18寸晶圆的尺寸以及相关发展历程。目前拥有12寸线的厂商只有5家,一个12寸晶圆厂的成本需要上百亿美金。 5nm工艺指的是在一个具体的芯片上,有很多微型结构(千万、亿级别的晶体管),这些核心基本单元MOS管的栅极宽度尺寸来衡量工艺的精细程度,如果是5nm就被称为5nm工艺

Hello World! 2万+

点云最小二乘法拟合曲线

文章目录一、引言 一、引言

dayuhaitang1的博客 2735

大整数类的实现(1)(原创)

       每次上论坛都能找到类似求100!的问题,其实这些题目归根究底就是一个大整数类的实现。一般大家提到的方法是用数组,每个数字要么表示一个10进制位,要么表示几个10进制位。我觉得这样虽然在对“人”是直观了,但是对“电脑”却非常不直观,所以我觉得应该按照计算机的2进制表示方式来实现。       按照自己的想法,我写了这样一个大整数类,内部用long的数组来表示,是在2进制层面,即

daidodo的专栏 2942

【PX4学习笔记】3. PX4 固件烧写(1 探索过程)

飞控型号:cube orange【PX4官方用户指南中关于cube orange的描述】 飞控载板型号:Mini Carrier Board【迷你载板说明文档】 固件安装参考:The Cube User Manual V1.0

【人工智障 | 计算鸡视觉 | 机器孩】 7677

大整数类的实现(5)(原创)

5.HugeNumberBase.h————————————————————————————————————————/* * Copyright (c) 2005 by DoZerg.  ALL RIGHTS RESERVED.  * Consult your license regarding permissions and restrictions. *//**************

daidodo的专栏 916

QCC51XX---人机接口设备协议( HID)

QCC51XX---人机接口设备协议( HID)

weixin_42162924的博客 820

DPABISurf使用教材

严老师的官方教程:http://rfmri.org/Course DPABISurf版本:dpabi50docker.tar.gz MATLAB版本:2018b 一、数据准备 (1)如果是数据的DICOM格式,整理成以下格式(注意文件夹的命名方式): 如果觉得不是很清楚,可以在官网下载Demo数据(http://rfmri.org/DemoData),参照里面的文件格式进行整理即可。 (2)如果数据是nii格式,整理成以下格式: 这里没有使用官网的demo数据进行学习,而是..

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 8521

大整数类的实现(2)(原创)

 3.SignedHugeLong.h————————————————————————————————————/* * Copyright (c) 2005 by DoZerg.  ALL RIGHTS RESERVED.  * Consult your license regarding permissions and restrictions. */#pragma once#inclu

daidodo的专栏 733

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

大整数类的实现(4)(原创)

 5.Helper.h————————————————————————————————————/* * Copyright (c) 2005 by DoZerg.  ALL RIGHTS RESERVED.  * Consult your license regarding permissions and restrictions. */#pragma once#includename

daidodo的专栏 833

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[ C++ 快速高精度模板 ] [ BigN类 ] 大整数类 高精度 模板 BigInt FFT 快速傅里叶变换...

【原创 转载请注明】瞎写的,如果代码有错,或者各位大佬有什么意见建议,望不吝赐教 更新日志:   对于规模较小的整数乘法使用$$O(n^2)$$方法,提高速度   modify()和operator[]的bug修正   除法速度提升   修正了除法崩溃的问题   修正了除数为零崩溃的问题 1 /** 2 * BigN Beata v1.3.1 3 *...

weixin_30897233的博客 256

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

c语言任意长度小数加减法,[c++]大数运算---利用C++ string实现任意长度正小数、整数之间的加减法...

本文为大大维原创,最早于博客园发表,转载请注明出处!!!一、概述C/C++中的int类型能表示的范围是-2E31-2E31–1。unsigned类型能表示的范围是0-2E32–1,即 0-4294967295。所以,int和unsigned类型变量,都不能保存超过10位的整数。有时我们需要参与运算的数,可能会远远不止10 位,例如,可能需要保留小数点后面100位(比如求π的值),那么,即便使用能表...

weixin_31618799的博客 1305

C++学习进程安排

[非原创,看到有参考价值,所以果断转来:原文链接]   第一阶段(Linux C开发) 目标:能使用并管理linux系统,熟悉linux开发环境。熟练掌握C语言语法。掌握Linux下C开发方法。 主题  内容 Linux最佳入门 ...

weixin_33755847的博客 91

求两个大整数(大于32位)的乘积的C++实现代码

//主要思路是两个数组放两个大数,一个数组放各个位相乘的中间结果,一个数组放最后结果 #include using namespace std; void Multiply() {     char num1[50],num2[50];     char

冒大烟的羊肉串的专栏 1906

C++ 高精度算法及N的阶乘

高精度算法

innounce的博客 9665

用C++设计并实现一个大整数类

http://blog.youkuaiyun.com/hackbuteer1/article/details/6595881 转载于:https://www.cnblogs.com/qianggezhishen/p/7349460.html

dengji8846的博客 2164
上一篇: 大整数类的实现(4)(原创)
下一篇: 大整数类的实现(5)(原创)
daidodo
博客等级 码龄22年 43粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值