计算机设计

---恢复内容开始---

3n+1问题:

while (n>1)

if (odd(n))

n=3*n+1;

else

n=n/2;

//在最坏的情况下,该算法的计算时间下界显然为log(n)

算法计算时间上界至今未知。著名的3n+1猜想,也称collatz猜想。

证明:如果一个算法在平均情况下的计算时间复杂性为

o(f(n)),则该算法在最坏情况下所需的计算时间为f(n)

算法实现题:

1-1统计数字问题:

问题描述:

一本书的页码从自然数1开始顺序编码直到自然数n,书的页码按照通常的习惯编码,每个

页码都不含多余的前导数字0,例如,第6页用数字6表示,而不是06,或006等,数字计数问题

要求对给定书的总页码n,计算出书的页码中分别用到多少次数字0,1,2,3,,,,9

算法设计:给定表示书的总页码的十进制整数n(1《n《10^9)计算书的全部页码中分别用到多少次数字0,1,2,-9.

分析:考察由0,1,2,,,,9组成的所有的n位数,从n个0到n个9共有10^n个位数。在这

10^n个n位数中,0,1,2,……9每个数字使用次数相同,设为f(n).

f(n)=n10^n-1

据此,可从高位向低位进行统计,再减去多余的0的个数即可

1-2字典序问题:

问题描述:

在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写英文字母组成A={a,b,c……z},该字母表产生的升序字符串是指字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现一次。例如,

算法设计:对于给定的长度不超过6的升序字符串,计算它在上述字典中的编码。

分析:设以第i个字符打头的长度不超过k的升序字符串个数为f(i,k)

1-3最多约数问题

正整数x的约数是能整除x的正整数。正整数x的约数个数记为div(x),例如,1,2,5,10

都是正整数10的约数,且div(10)=4,设a和b是2个正整数,a《b,找到a和b之间约数个数最多的

数x

分析:primes产生质数

void primes ()

{

bool get[MAXP+1];

for(int i=2;i<=MAXP;i++)get[i]=true;

for (i=2;i<=MAXP;i++)

if (get[i]){

int j=i+1;

while (j<MAXP)

1-4金币阵列问题

问题描述:有M*N枚金币在桌子上排成一个m行n列的金币阵列。每一枚金币或正面朝上,

或背面朝上,用数字表示金币状态,0表示金币正面朝上,1相反。

游戏规则是:

(1)每一次可将任一行金币翻过来放在原来的位置上,

(2)每次可任选2列,交换这2列金币的位置。

分析:枚举初始状态每一列变换为目标状态第一列的情况。算法描述如下:

int k,n,m,count,best;

int b0[Size+1][Size+1】,b1[Size+1][Size+1];

bool found;

int main()

{

cin>>k;

for (int i=1;i<=k;i++)

for (int y=1;y<=m;y++)

cin>>b0[x][y];

for (x=1;x<n;x++)

for (int y=1;y<=m;y++)

cin>>b1[x][y];

acpy();

1-5最大间隙问题

问题:最大间隙问题:给定n个实数X1,X2,求这n个数在实轴上相邻2个数之间的最大差值,

假设对任何实数的下取整函数耗时o(1),设计解最大间隙问题的线性时间算法。

分析:

用鸽舍原理设计最大间隙问题的线性时间算法如下:

---恢复内容结束---

原文地址:https://www.cnblogs.com/heruonan/p/8450370.html