《计算机常用算法与程序设计案例教程》习题解答Word文档下载推荐.docx

上传人:b****3 文档编号:15828107 上传时间:2022-11-16 格式:DOCX 页数:96 大小:143.48KB
下载 相关 举报
《计算机常用算法与程序设计案例教程》习题解答Word文档下载推荐.docx_第1页
第1页 / 共96页
《计算机常用算法与程序设计案例教程》习题解答Word文档下载推荐.docx_第2页
第2页 / 共96页
《计算机常用算法与程序设计案例教程》习题解答Word文档下载推荐.docx_第3页
第3页 / 共96页
《计算机常用算法与程序设计案例教程》习题解答Word文档下载推荐.docx_第4页
第4页 / 共96页
《计算机常用算法与程序设计案例教程》习题解答Word文档下载推荐.docx_第5页
第5页 / 共96页
点击查看更多>>
下载资源
资源描述

《计算机常用算法与程序设计案例教程》习题解答Word文档下载推荐.docx

《《计算机常用算法与程序设计案例教程》习题解答Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《计算机常用算法与程序设计案例教程》习题解答Word文档下载推荐.docx(96页珍藏版)》请在冰豆网上搜索。

《计算机常用算法与程序设计案例教程》习题解答Word文档下载推荐.docx

1-2求出以下程序段所代表算法的时间复杂度

(1)m=0;

for(k=1;

k<

=n;

k++)

for(j=k;

j>

=1;

j--)

m=m+j;

因s=1+2+…+n=n(n+1)/2

时间复杂度为O(n2)。

(2)m=0;

 for(k=1;

 for(j=1;

j<

=k/2;

j++)

设n=2u+1,语句m=m+1的执行频数为

s=1+1+2+2+3+3+…+u+u=u(u+1)=(n−1)(n+1)/4

设n=2u,语句m=m+1的执行频数为

s=1+1+2+2+3+3+…+u=u2=n2/4

时间复杂度为O(n2)。

(3)t=1;

m=0;

{t=t*k;

for(j=1;

=k*t;

}

因s=1+2×

2!

+3×

3!

+…+n×

n!

=(n+1)!

−1

时间复杂度为O((n+1)!

).

(4)for(a=1;

a<

a++)

{s=0;

for(b=a*100−1;

b>

=a*100−99;

b−=2)

{for(x=0,k=1;

=sqrt(b);

k+=2)

if(b%k==0)

{x=1;

break;

s=s+x;

if(s==50)

printf("

%ld\n"

a);

因a循环n次;

对每一个a,b循环50次;

对每一个b,k循环

次。

因而k循环体的执行次数s满足

时间复杂度为O(

)。

1-3若p(n)是n的多项式,证明:

O(log(p(n)))=O(logn)。

证:

设m为正整数,p(n)=a1×

nm+a2×

nm-1+…+am×

n,

取常数c>

ma1+(m-1)a2+…+am,则

log(p(n))=ma1×

logn+(m-1)a2×

logn+…=(ma1+(m-1)a2+…)×

logn

<

clogn

因而有O(log(p(n)))=O(logn)。

1-4构建对称方阵

观察图1-5所示的7阶对称方阵:

 

图1-57阶对称方阵

试构造并输出以上n阶对称方阵。

这是一道培养与锻炼我们的观察能力与归纳能力的案例,一个一个元素枚举赋值显然行不通,必须全局着眼,分区域归纳其构造特点,分区域枚举赋值。

(1)设计要点

设方阵中元素的行号为i,列号为j。

可知主对角线:

i=j;

次对角线:

i+j=n+1。

两对角线赋值“0”。

按两条对角线把方阵分成上部、左部、右部与下部4个区,如图1-6所示。

图1-6对角线分成的4个区

上部按行号i赋值;

下部按行号函数n+1-i赋值。

左部按列号j赋值;

右部按列号函数n+1-j赋值。

(2)程序实现

#include<

stdio.h>

voidmain()

{inti,j,n,a[30][30];

请确定方阵阶数n:

"

);

scanf("

%d"

&

n);

for(i=1;

i<

i++)

{if(i==j||i+j==n+1)

a[i][j]=0;

//方阵对角线元素赋值

if(i+j<

n+1&

&

i<

j)

a[i][j]=i;

//方阵上部元素赋值

i>

a[i][j]=j;

//方阵左部元素赋值

if(i+j>

a[i][j]=n+1-i;

//方阵下部元素赋值

a[i][j]=n+1-j;

//方阵右部元素赋值

%d阶对称方阵为:

\n"

n);

i++)

{for(j=1;

j++)//输出对称方阵

%3d"

a[i][j]);

1-5据例1-2的算法,写出求解n个“1”组成的整数能被2011整除的程序。

修改程序,求出n至少为多大时,n个“1”组成的整数能被2013整除?

程序为

{inta,c,p,n;

p=2011;

c=1111;

n=4;

//变量c与n赋初值

while(c!

=0)//循环模拟整数竖式除法

{a=c*10+1;

c=a%p;

n=n+1;

//每试商一位n增1

printf("

由%d个1组成的整数能被%d整除。

n,p);

习题2

2-1解不等式

设n为正整数,解不等式

上下限一般为键盘输入的a,b。

//解不等式:

a<

1+1/(1+1/2)+...+1/(1+1/2+...+1/n)<

b

#include<

math.h>

{longa,b,c,d,i;

doublets,s;

请输入a,b:

%d,%d"

a,&

b);

i=0;

ts=0;

s=0;

while(s<

a)

{i=i+1;

ts=ts+(double)1/i;

s=s+1/ts;

c=i;

b)

{i=i+1;

s=s+1/ts;

d=i-1;

\n满足不等式的正整数n为:

%ld≤n≤%ld\n"

c,d);

2-2信点兵

信在点兵的时候,为了知道有多少个兵,同时又能保住军事,便让士兵排队报数。

按从1至5报数,记下最末一个士兵报的数为1;

再按从1至6报数,记下最末一个士兵报的数为5;

再按1至7报数,记下最末一个报的数为4;

最后按1至11报数,最末一个士兵报的数为10。

你知道信至少有多少兵?

1.求解要点

设兵数为x,则x满足下述的同余方程组:

x=5y+1即x=1(mod5)

x=6z+5x=5(mod6)

x=7u+4x=4(mod7)

x=11v+10x=10(mod11)

其中y,z,u,v都为正整数。

试求满足以上方程组的最小正整数x。

应用枚举可得到至少的兵数。

x从1开始递增1取值枚举当然可以,但不必要。

事实上枚举次数可联系问题的具体实际大大缩减。

(1)注意到x除11余10,于是可设置x从21开始,以步长11递增。

此时,只要判别前三个条件即可。

(2)由以上第2,4两方程知x+1为11的倍数,也为6的倍数。

而11与6互素,因而x+1必为66的倍数。

于是取x=65开始,以步长66递增。

此时,只要判别x%5=1与x%7=4两个条件即可。

这样可算得满足条件的最小整数x即点兵的数量。

2.程序实现

//信点兵

{longintx;

x=65;

while

(1)

{x=x+66;

if(x%5==1&

x%7==4)

{printf("

至少有兵:

%ld个。

"

x);

break;

}

2-3分解质因数

对给定区间[m,n]的正整数分解质因数,每一整数表示为质因数从小到大顺序的乘积形式。

如果被分解的数本身是素数,则注明为素数。

例如,2012=2*2*503,2011=(素数!

对区间中的每一个整数i(b=i),用k(2——sqrt(i))试商:

若不能整除,说明该数k不是b的因数,k增1后继续试商。

若能整除,说明该数k是b的因数,打印输出"

k*"

b除以k的商赋给b(b=b/k)后继续用k试商(注意,可能有多个k因数),直至不能整除,k增1后继续试商。

按上述从小至大试商确定的因数显然为质因数。

如果有大于sqrt(n)的因数(至多一个!

),在试商循环结束后要注意补上,不要遗失。

如果整个试商后b的值没有任何缩减,仍为原待分解数n,说明n是素数,作素数说明标记。

若k是b的因数,按格式输出,然后b=b/k后继续试商k。

若k不是b的因数,则k增1后继续。

若上述试商完成后1<

b<

i,说明i有一个大于sqrt(i)的因数,要补上该因数。

若试商后b还是原来的i,则i是素数。

//质因数分解乘积形式

#include"

math.h"

{longintb,i,k,m,n,w=0;

[m,n]中整数分解质因数(乘积形式).\n"

请输入m,n:

scanf("

%ld,%ld"

m,&

for(i=m;

i++)//i为待分解的整数

{printf("

%ld="

i);

b=i;

k=2;

while(k<

=sqrt(i))//k为试商因数

{if(b%k==0)

{b=b/k;

if(b>

1)

{printf("

%ld*"

k);

continue;

//k为质因数,返回再试

if(b==1)printf("

%ld\n"

k++;

if(b>

1&

b<

i)

b);

//输出大于i平方根的因数

if(b==i)

(素数!

)\n"

w++;

}//b=i,表示i无质因数

2-4基于素数代数和的最大最小

定义和:

(和式中第k项±

(2k-1)*(2k+1)的符号识别:

当(2k-1)与(2k+1)中至少有一个素数,取“+”;

其余取“-”。

例如和式中第13项取“-”,即为-25*27。

1)求s(2011)。

2)设1<

=n<

=2011,当n为多大时,s(n)最大。

3)设1<

=2011,当n为多大时,s(n)最小。

代数和式中各项的符号并不是简单的正负相间,而是随着构成素数而改变。

因而在求和之前应用“试商判别法”对第k个奇数2k-1是否为素数进行标注:

若2k-1为素数,标注a[k]=1;

否则,若2k-1不是素数,a[k]=0。

设置k循环(1——n),循环中分别情况求和:

若a[k]+a[k+1]>

=1,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1