2.5 整数和算法

2.5.1 引言

  正如2.1节所说, 算法这一术语最初指的是用整数的十进制法表示的用法进行算术运算的过程。修改后能处理二进制表示的这些算法是计算机算术的基础。这些算法为理解算法这一概念及算法复杂度提供了很好的实例。因此本书将讨论这些算法。

  除算术中常用的整数算法以外,还有许多涉及整数的算法,包括欧里几德算法,这是最有用的算法之一,很可能是数学中最古老的算法。我们还将描述一个算法,用于对任意基数b求正整数的b进制展开和求同余幂,在密码学中这是个重要的算法。

2.5.2 整数的表示

  日常生活中都用十进制记号表示整数。例如,965用来表示 9.102+6.10+5。 不过有时用10以外的数字为基数更为方便。特别是计算机常用二进制记号(以2为基数)来做算术运算,而用八进制(基数为8)或十六进制(基数为16)记号来表示字符,如字母或字符。事实上,可以用1以外的任何正整数为基数表示整数。定理1陈述的就是这一结论。

定理1 令b为不等于1的正整数。那么如果n是个正整数,就可以唯一地表示为下面的形式:

            n=ak.bk+ ak-1.bk-1+...+a1b+a0

其中k是非负整数,a0, a1,...,

时间: 2024-08-27 22:19:56

2.5 整数和算法的相关文章

无限大整数相加算法的C语言源代码

忙里偷闲,终于完成了无限大整数相加算法的C语言代码,无限大整数相加算法的算法分析在这里. 500位的加法运行1000次,不打印结果的情况下耗时0.036秒,打印结果的情况下耗时16.285秒. 下面是源码: #include <stdio.h> #include <stdlib.h> #include<string.h> #include <time.h> #define MAXNUM 1000000000000000000 /* 存储数据用的结构 long

更快的求整数幂算法

相信整数幂运算作为一个算法演变的例子是再合适不过的了为了节省访客们宝贵的学习时间省去介绍递归等可能涉及到的初级概念的定义.同时如果发现文中有错误的地方请敞开衣服指正. 因为在测试性能时合适的测试数据是必要的,所以本文用C++的大数类进行演示. 点击获取C++大数类源码 这里我们先列一下会提到的算法分析技术: 动态规划 减治法 测试平台: Linux g++ 4.7 原始递归方法 这就不花时间赘述什么了. BigInteger pow(BigInteger x, int N) { if (N ==

利用移位、加减法实现整数开平方算法的方法(转)

利用移位.加减法实现整数开平方算法的方法(转) 本算法只采用移位.加减法.判断和循环实现,因为它不需要浮点运算,也不需要乘除运算,因此可以很方便地运用到各种芯片上去. 我们先来看看10进制下是如何手工计算开方的.先看下面两个算式,x = 10*p + q  (1)公式(1)左右平方之后得:x^2 = 100*p^2 + 20pq + q^2 (2)现在假设我们知道x^2和p,希望求出q来,求出了q也就求出了x^2的开方x了.我们把公式(2)改写为如下格式:q = (x^2 - 100*p^2)/

2的幂位数大整数分治算法

#include <iostream> #include <cstring> #include <string> #include <cstdio> using namespace std; //500 digits at most struct Num{ int num[1000],len; Num(){ memset(num,0,sizeof(num)); len=1; } Num(const string &s){ len=s.size();

字符串转化为整数的算法改进及优化

我们知道C语言有一个库函数atoi (表示 alphanumeric to integer)是把字符串转换成整型数的一个函数.那么如何实现这个函数呢? 很多同学很快会写出下列代码: int StrtoInt(char str[]) { assert(str); int num=0; while(*str) { num=num*10+*str-'0'; ++str; } return num; } 这个代码有没有什么漏洞呢?虽然用了assert来检查了空指针,但是,试想一下,如果我们传进去的字符串

大整数算法

本文主要整理了几个常用的大整数的算法:大整数加法大整数乘法大整数阶乘大整数幂其实大体的思路都差不多,都是用数组来存储大整数.以下的代码仅仅实现功能,并没有充分详细的参数判断,在实际运用中,肯定是需要考虑的. 大整数相加 1 #include <stdio.h> 2 #include <string.h> 3 #define N 1000 4 void get_num(int *array) 5 { 6 char str[N] = {'\0'}; 7 int loop = 0; 8

算法笔记01--归纳法之整数幂

整数幂 算法1:对实数x的n次幂设计一个有效的算法.一种直接的方法是对x用迭代方法自乘n次,这种方法十分低效,因为它需要O(n)乘法.一个高效的方法可以用如下方法推出,令m=n/2,假设已经知道如何计算x^m.那么有两种情况:如果n是偶数,那么x^n = (x^m)^2:否则x^n = x(x^m)^2. 算法2:令n的二进制表示为dn-1.....d1,d0.从y=1开始,由n的高位至地位扫描,如果二进制数字为0,就对y平方:如果为1就对y平方并乘x.这就产生了递归算法EXPREC. 时间复杂

算法(第四版)C#题解&mdash;&mdash;1.4

写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 这一节内容可能会用到的库文件有 Measurement 和 TestCase,同样在 Github 上可以找到. 善用 Ctrl + F 查找题目. 习题&题解 1.4.1 题目 证明从 N 个数中取三个整数的不同组合总数为 N(N - 1)(N - 2) / 6. 解答 即为证明组合计算公式: C(N, 3) = N! / [

8大排序算法图文讲解

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等. 本文将依次介绍上述八大排序算法. 算法一:插入排序 插入排序示意图 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤: 1)将第一待排序序列第一