今天主要讲一下数学的知识。

  一、进制转换:

      十进制到k进制:短除法:顺除至0,逆序取余。

      k进制转十进制:乘权相加。

      常见进制:四进制(对应2位二进制)、八进制(对应3位二进制)、十六进制(对应4位二进制,A表示10,B表示11,...,F表示15)

      常见进制在c++中的表示:二进制:前加0b;八进制:前加0;十六进制:前加0x。 

      小提示:只有十进制下的读数是“...几千几百...”的读法,其他进制都直接把数位上的数读出来就行辣。

  二、高精度 

      常见数据类型的范围:int:[-232,232-1]

                long long :[-263,263-1]≈1020

      那么对于超过这些数据范围的数怎么办呢?(我才不说有个int_128) ,这时候就要用到高精度了。高精度就是用来解决大整数的运算。

      有关高精度加减乘除的基本讲解可见我的另一篇博客,这里只说说新的东西。

    https://www.cnblogs.com/InductiveSorting-QYF/p/10679946.html(博客地址)

      对于高精度,我们可以写好高精度重载运算符的模板,码程序时先用int型码好程序,用小数验证算法正确性后再将int改成高精型(结构体的运用),否则程序出错后难以判断出错在算法还是高精。对于初始化结构体,可用构造函数(面向对象的知识),简单来说就是一个不写类型、函数名为结构体类型名、写在结构体里的函数,该函数每当有该结构体对象声明时都会被调用一次。(与此对应的还有析构函数,有兴趣的OIER可以看看:https://www.runoob.com/cplusplus/cpp-constructor-destructor.html(C++ 类构造函数 & 析构函数

)    配合C++中struct和class的区别  食用更佳)

      代码如下:

 struct gaojing
{
int z[];
int l;
gaojing()
{
l=;
memset(z,,sizeof(z));
}
}

      重载运算符(以加号为例)代码:

 gaojing operator+(gaojing a,gaojing b)
{
gaojing c; int l = max(a.l,b.l);
for (int i=;i<l;i++)
{
c.z[i] += a.z[i] + b.z[i];
c.z[i+] += c.z[i] / ;
c.z[i] = c.z[i] % ;
}
if (c.z[l] != ) l++;
c.l = l; return c;
}

     细心的同学会发现,其实这个有个问题。想必大家都知道函数传值调用与传址调用的区别:传值调用不会改变主调用函数中变量的值,而传址调用则会改变。同时由此发现每次传值调用都会拷贝一份主调用函数的变量。这个变量小的话还好,但如果要是很大的数组的话,必然会增加额外的时间复杂度,而且一个程序的加法运算又很多,那么调用函数的次数也很多,总的一看,时间就被浪费许多了。  

      怎么处理这种情况?

      既然传值调用不行,传址调用就好了嘛。同时为了防止打码手抖改掉加数的值,可在形参表中加上const。正确代码如下:

 gaojing operator+(const gaojing &a,const gaojing &b)
{
gaojing c; int l = max(a.l,b.l);
for (int i=;i<l;i++)
{
c.z[i] += a.z[i] + b.z[i];
c.z[i+] += c.z[i] / ;
c.z[i] = c.z[i] % ;
}
if (c.z[l] != ) l++;
c.l = l; return c;
}

      其他的运算符重载大都与此相差不大。这里再说明一下输入输出的重载:

代码如下:

 struct gaojing
{
int z[];
int l; friend istream& operator>>(istream &cin, gaojing &a)
{
static char s[];
cin >> s;
int l=strlen(s);
for (int i=;i<l;i++)
a.z[i] = s[l-i-] - '';
a.l = l; return cin;
} friend ostream& operator<<(ostream &cout,const gaojing &a)
{
for (int i=a.l-;i>=;i--)
cout << a.z[i]; return cout;
}
};

输入/出的重载有点特别。它们需要写在struct的定义中。(好像因为是友联函数什么的,就是那个friend啦。),而且重载的是“<<”和">>"。istream和ostream是输入和输出流,函数形参表的意思差不多是:将cin里的数读到a中;将a里的数输出到cout中。只能是cin和cout,不能scanf和printf。(百度警告)。重载完各种运算符后,就可以把int型扔掉了,写程序真方便(高精模板真多)

    最后TIP:以上提及的四则运算符都没有考虑有负数出现的情况,有负数需另考虑。

      

    

        

      

<知识整理>2019清北学堂提高储备D4的更多相关文章

  1. <知识整理>2019清北学堂提高储备D2

    简单数据结构: 一.二叉搜索树 1.前置技能: n/1+n/2+……+n/n=O(n log n)  (本天复杂度常涉及) 2.入门题引入: N<=100000. 这里多了一个删除的操作,因此要 ...

  2. <知识整理>2019清北学堂提高储备D3

    全天动态规划入门到入坑... 一.总概: 动态规划是指解最优化问题的一类算法,考察方式灵活,也常是NOIP难题级别.先明确动态规划里的一些概念: 状态:可看做用动态规划求解问题时操作的对象. 边界条件 ...

  3. <知识整理>2019清北学堂提高储备D1

    一.枚举: 枚举是最简单最基础的算法,核心思想是将可能的结果都列举出来并判断是否是解. 优点:思维简单,帮助理解问题.找规律.没头绪时 缺点:时空复杂度较高,会有很多冗余的非解(简单的枚举几乎没有利用 ...

  4. <知识整理>2019清北学堂提高储备D5

    今天主讲图论. 前言:图的定义:图G是一个有序二元组(V,E),其中V称为顶集(Vertices Set),E称为边集(Edges set),E与V不相交.它们亦可写成V(G)和E(G). 一.图的存 ...

  5. 清北学堂提高突破营游记day1

    上午7点半到的国防宾馆,8点开始的培训. 讲课人林永迪. 没错就是这个人: 他推荐的教辅:刘汝佳紫书,算法导论(也就看看..),刘汝佳白书 先讲模拟.(貌似就是看题论题. 然后贪心. 贪心没有固定的模 ...

  6. 清北学堂提高组突破营游记day3

    讲课人更换成dms. 真的今天快把我们逼疯了.. 今天主攻数据结构, 基本上看完我博客能理解个大概把, 1.LCA 安利之前个人博客链接.之前自己学过QWQ. 2.st表.同上. 3.字符串哈希.同上 ...

  7. 清北学堂提高组突破营考试T1

    题目如下: (想要作弊的后几届神仙们我劝你们还是别黈了,这个题如果你们不会只能证明你们上错班了). 好,题目看完了,发现是一道大模拟(%你)题,于是我们按照题目说的做: #include<ios ...

  8. 清北学堂提高组突破营游记day6

    还有一天就结束了..QWQ 好快啊. 昨天没讲完的博弈论DP: 一个标准的博弈论dp,一般问的是是否先手赢. 博弈论最关键的问题:dp过程. 对于一个问题,一定有很多状态,每个状态可以转移到其他的一些 ...

  9. 清北学堂提高组突破营游记day5

    长者zhx来啦.. (又要送冰红茶了...) zhx一上来就讲动态规划...是不是要逼死人.... 动态规划: 最简单的例子:斐波那契数列.因为他是递推(通项公式不算)的,所以前面的已经确定的项不会影 ...

随机推荐

  1. Vue.js系列:生命周期钩子

    开发人员提供了一个Web开发人员可以在Vue.js应用程序的整个生命周期中使用的各种方法的讨论. 生命周期钩子是在Vue对象生命周期的某个阶段执行的已定义方法.从初始化开始到它被破坏时,对象都会遵循不 ...

  2. js for 循环

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. P1118 [USACO06FEB]数字三角形`Backward Digit Su`… (dfs)

    https://www.luogu.org/problemnew/show/P1118 看的出来是个dfs 本来打算直接从下到上一顿搜索 但是不会 看了题解才知道系数是个杨辉三角....... 这样就 ...

  4. 递归法求组合数C(m,n)

    假设这样一个数组: 1 2 3 4 5 n=5 若 m=3 也就是要求C(3,5) 首先先选第一个数 1 那么剩下的工作就是在2-5之间选择2个数 如果我们没有选择第一个数 选第二个数2 那么剩下的工 ...

  5. 多线程18-QueueUserWorkItem

        ));         }         ;             ;             ));             ThreadPool.QueueUserWorkItem(A ...

  6. 关于android工具链

    1 android sdk platform tools 同android platform交互的工具,包括adb.fastboot和systrace. 2 sdk build tools 用于bui ...

  7. Windows Server 2012 上安装 dotNET Framework v3.5

    Windows Server 2012不能直接运行dotNET Framework v3.5安装程序进行安装,系统提供通过服务器管理器的添加功能和角色向导进行安装. 安装的前几个步骤再这里略去,在默认 ...

  8. MyBatis逆向工程无效

    在Taget目录下修改的东西无法逆向, 在源代码目录就可以

  9. 小白学Python——Matplotlib 学习(3) 函数图形

    import matplotlib.pyplot as plt import numpy as np x = np.linspace(-1,1,50) y = 2*x + 1 plt.figure() ...

  10. Let's encrypt 通配域名DNS验证方式的证书自动更新

    通配符域名不同于一般的单域名证书. 为了解决之前一篇短文中通配域名通过DNS方式验证的证书自动更新问题. 需要使用到第三方域名提供商的API, 用于自动添加域名的TXT记录, 实现自动验证并完成证书更 ...