数据结构与算法课程第4章的习题答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
else if(i<=400000)
bonus=bonus2+(i-200000)*0.05;
else if(i<=600000)
bonus=bonus4+(i-400000)*0.03;
else if(i<=1000000)
bonus=bonus6+(i-600000)*0.015;
else
bonus=bonus10+(i-1000000)*0.01;
程序流程图:
程序代码:
#include<stdio.h>
void main() {
long i,j,k;
k=10;
for (i=2;i<=1000;i++){
if (i==k) k*=10;
j=i*i;
if(j%k==i)
printf("%ld\t%ld\n",i,j);
}
}
(8)电视台点歌,收费标准为:前10分钟每分钟1.5元,10分钟后每增加1分钟付1元,2小时后不再付费,但6小时后又重新开始计算。计算点歌结束后的付费金额。
swich(branch){
case0: bonus=i*0.1;break;
case1: bonus=bonus1+(i-100000)*0.075;break;
case2:
case3:bonus=bonus2+(i-200000)*0.05;break;
case4:
case5:bonus=bonus4+(i-400000)*0.03;break;
}
(5)求1+2!+3!+…+20!的和。
程序流程图:
程序代码:
#include<stdio.h>
void main(){
doubles=0,t=1;
int n;
for(n=1;n<=20;n++){
t=t*n;
s=s+t;
}
printf(“1!+2!+3!+·······+20!=%e\n”,s);
#define N 7 //图案共N行,整个图案距屏幕左边L列,使居屏幕中间
#define L (80N)/2
#includestdio.h
void main() {
char cA;
int i, j, p;
for (i1; iN; i,c) {
if (i(N1)/2) pi;
else pN+1-i;
第4章
4.1程序阅读题。以下程序运行结果是什么?
#includestdio.h
void main() {
int i1;
while (i15)
if (i3!2)continue;
else printf(d,i);
printf(\n);
}
结果为:2 5 8 11 14
4.2程序填空题。输出右边所示图案(共N行,N为奇数,此时N=7)。
(c)图案1的NS图(d)图案2的NS图
(e)图案1的程序(f)图案2的程序
(3)猴子吃桃子问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃掉了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少个桃子。
else if(time<=120)
money=money+15+(time-10)*1;
else
money=money+125;// 2小时的费用:10分钟*1.5元+110分钟*1元=125元
printf(“money is %.2f\n”,money);
}
bonus6=bonus4+200000*0.03;
bonus10=bonus6+400000*0.015;
printf(“请输入利润i:”);
scanf(“%f”,&i);
if(i<=100000)
bonus=i*0.1;
else if(i<=200000)
bonus=bonus1+(i-100000)*0.075;
8-i;
for (j1; jL(N1)/2-p; j)
4-p;
printf();
for (j1; j2*p1; j)
printf(c, c);
printf(\n);
}
}
4.3画流程图并编写程序。
(1)企业发放的奖金根据利润提成。利润(I)低于或等于10万元的,奖金可提10;利润高于10万元,低于或等于20万元(100000I200000)时,低于或等于10万元的部分按10提成,高于10万元的部分,可提成7.5;200000I400000时,低于或等于20万元的部分仍按上述办法提成(下同),高于20万元的部分按5提成;400000I600000时,高于40万元的部分按3提成;600000I1000000时,高于60万元的部分按1.5提成;I1000000时,超过100万元的部分按1提成。从键盘输入当月利润I,求应发奖金总数。
程序代码:
#include<stdio.h>
void main( ){
int time; floatmoney;
scanf(“%d”,&time);
money= time/360*125;// time分钟包含了几个6小时。
time=time%360;// 6小时之内的时间
if(time<=10)
money=money+time*1.5;
如果每逢奇数天都吃剩下的一半,又多吃一个;每逢偶数天都吃剩下的一半,又多吃二个。到第10天早上想再吃时,见只剩下一个,再求第一天共摘多Biblioteka Baidu个桃子。
(a)问题1的流程图(b)问题2的流程图
(c)问题1的程序(d)问题2的程序
(4)国际象棋的发明者、古印度的宰相在国王要奖励他时,要求国王在棋盘的第一格中放1粒麦子,第二格中放2粒麦子,第三格中放4粒,以后每一格中放的麦粒数都是前一格的两倍,直至放满64格。如果这个奖励要兑现的话,他将得到多少立方米的麦子(1立方米的麦子约等于1.42*108粒)?
程序流程图:
程序代码:
#include<stdio.h>
void main(){
inti;
doublesn=1,sum=1;//sum最后的数值非常大,不能用int,long等数值类型。
for(i=2;i<=64;i++){
sn=sn*2;
sum+=sn;
}
printf(“sum is %e\n”,sum/1.42e8);
流程图:
①用if语句编写程序
#include<stdio.h>
void main(){
doublei,bonus,bonus1,bonus2,bonus4,bonus6,bonus10;// bonus:奖金
bonus1=100000*0.1;
bonus2=bonus1+100000*0.075;
bonus4=bonus2+200000*0.05;
void main(){
longa,n,i=1,sn=0,tn=0;
printf(“Inputa,n:”);
scanf(“%d,%d”,&a,&n);
while(i<=n){
tn=10*tn+a;
sn=sn+tn;
++i;
}
printf(“a+aa+aaa+······=%ld\n”,sn);
}
(7)输出2至1000之间的所有同构数,所谓同构数是指它出现在它的平方数的右端。例如,5、6、25的平方分别等于25、36、625,所以5、6和25都是同构数。
}
注意:s、t不能定义为int,long型,因为这两种数据类型的范围都不超过21亿,无法容纳最后求的结果。
(6)求s=a+aa+aaa+…+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入控制。
程序流程图:
程序代码:
#include<stdio.h>
printf(“奖金是%10.2f\n”,bonus);
}
②用switch语句编写程序
#include<stdio.h>
void main(){
int branch;
doublei,bonus,bonus1,bonus2,bonus4,bonus6,bonus10;
bonus1=100000*0.1;
bonus2=bonus1+100000*0.075;
bonus4=bonus2+200000*0.05;
bonus6=bonus4+200000*0.03;
bonus10=bonus6+400000*0.015;
printf(“请输入利润i:”);
scanf(“%f”,&i);
branch=(int)(i/100000);
case6:
case7:
case8:
case9:bonus=bonus6+(i-600000)*0.015;break;
otherwise:bonus=bonus10+(i-1000000)*0.01;
}
printf(“奖金是%10.2f\n”,bonus);
}
(2)分别输出如下图案。
(a)图案1的传统流程图(b)图案2的传统流程图
bonus=bonus2+(i-200000)*0.05;
else if(i<=600000)
bonus=bonus4+(i-400000)*0.03;
else if(i<=1000000)
bonus=bonus6+(i-600000)*0.015;
else
bonus=bonus10+(i-1000000)*0.01;
程序流程图:
程序代码:
#include<stdio.h>
void main() {
long i,j,k;
k=10;
for (i=2;i<=1000;i++){
if (i==k) k*=10;
j=i*i;
if(j%k==i)
printf("%ld\t%ld\n",i,j);
}
}
(8)电视台点歌,收费标准为:前10分钟每分钟1.5元,10分钟后每增加1分钟付1元,2小时后不再付费,但6小时后又重新开始计算。计算点歌结束后的付费金额。
swich(branch){
case0: bonus=i*0.1;break;
case1: bonus=bonus1+(i-100000)*0.075;break;
case2:
case3:bonus=bonus2+(i-200000)*0.05;break;
case4:
case5:bonus=bonus4+(i-400000)*0.03;break;
}
(5)求1+2!+3!+…+20!的和。
程序流程图:
程序代码:
#include<stdio.h>
void main(){
doubles=0,t=1;
int n;
for(n=1;n<=20;n++){
t=t*n;
s=s+t;
}
printf(“1!+2!+3!+·······+20!=%e\n”,s);
#define N 7 //图案共N行,整个图案距屏幕左边L列,使居屏幕中间
#define L (80N)/2
#includestdio.h
void main() {
char cA;
int i, j, p;
for (i1; iN; i,c) {
if (i(N1)/2) pi;
else pN+1-i;
第4章
4.1程序阅读题。以下程序运行结果是什么?
#includestdio.h
void main() {
int i1;
while (i15)
if (i3!2)continue;
else printf(d,i);
printf(\n);
}
结果为:2 5 8 11 14
4.2程序填空题。输出右边所示图案(共N行,N为奇数,此时N=7)。
(c)图案1的NS图(d)图案2的NS图
(e)图案1的程序(f)图案2的程序
(3)猴子吃桃子问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃掉了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少个桃子。
else if(time<=120)
money=money+15+(time-10)*1;
else
money=money+125;// 2小时的费用:10分钟*1.5元+110分钟*1元=125元
printf(“money is %.2f\n”,money);
}
bonus6=bonus4+200000*0.03;
bonus10=bonus6+400000*0.015;
printf(“请输入利润i:”);
scanf(“%f”,&i);
if(i<=100000)
bonus=i*0.1;
else if(i<=200000)
bonus=bonus1+(i-100000)*0.075;
8-i;
for (j1; jL(N1)/2-p; j)
4-p;
printf();
for (j1; j2*p1; j)
printf(c, c);
printf(\n);
}
}
4.3画流程图并编写程序。
(1)企业发放的奖金根据利润提成。利润(I)低于或等于10万元的,奖金可提10;利润高于10万元,低于或等于20万元(100000I200000)时,低于或等于10万元的部分按10提成,高于10万元的部分,可提成7.5;200000I400000时,低于或等于20万元的部分仍按上述办法提成(下同),高于20万元的部分按5提成;400000I600000时,高于40万元的部分按3提成;600000I1000000时,高于60万元的部分按1.5提成;I1000000时,超过100万元的部分按1提成。从键盘输入当月利润I,求应发奖金总数。
程序代码:
#include<stdio.h>
void main( ){
int time; floatmoney;
scanf(“%d”,&time);
money= time/360*125;// time分钟包含了几个6小时。
time=time%360;// 6小时之内的时间
if(time<=10)
money=money+time*1.5;
如果每逢奇数天都吃剩下的一半,又多吃一个;每逢偶数天都吃剩下的一半,又多吃二个。到第10天早上想再吃时,见只剩下一个,再求第一天共摘多Biblioteka Baidu个桃子。
(a)问题1的流程图(b)问题2的流程图
(c)问题1的程序(d)问题2的程序
(4)国际象棋的发明者、古印度的宰相在国王要奖励他时,要求国王在棋盘的第一格中放1粒麦子,第二格中放2粒麦子,第三格中放4粒,以后每一格中放的麦粒数都是前一格的两倍,直至放满64格。如果这个奖励要兑现的话,他将得到多少立方米的麦子(1立方米的麦子约等于1.42*108粒)?
程序流程图:
程序代码:
#include<stdio.h>
void main(){
inti;
doublesn=1,sum=1;//sum最后的数值非常大,不能用int,long等数值类型。
for(i=2;i<=64;i++){
sn=sn*2;
sum+=sn;
}
printf(“sum is %e\n”,sum/1.42e8);
流程图:
①用if语句编写程序
#include<stdio.h>
void main(){
doublei,bonus,bonus1,bonus2,bonus4,bonus6,bonus10;// bonus:奖金
bonus1=100000*0.1;
bonus2=bonus1+100000*0.075;
bonus4=bonus2+200000*0.05;
void main(){
longa,n,i=1,sn=0,tn=0;
printf(“Inputa,n:”);
scanf(“%d,%d”,&a,&n);
while(i<=n){
tn=10*tn+a;
sn=sn+tn;
++i;
}
printf(“a+aa+aaa+······=%ld\n”,sn);
}
(7)输出2至1000之间的所有同构数,所谓同构数是指它出现在它的平方数的右端。例如,5、6、25的平方分别等于25、36、625,所以5、6和25都是同构数。
}
注意:s、t不能定义为int,long型,因为这两种数据类型的范围都不超过21亿,无法容纳最后求的结果。
(6)求s=a+aa+aaa+…+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入控制。
程序流程图:
程序代码:
#include<stdio.h>
printf(“奖金是%10.2f\n”,bonus);
}
②用switch语句编写程序
#include<stdio.h>
void main(){
int branch;
doublei,bonus,bonus1,bonus2,bonus4,bonus6,bonus10;
bonus1=100000*0.1;
bonus2=bonus1+100000*0.075;
bonus4=bonus2+200000*0.05;
bonus6=bonus4+200000*0.03;
bonus10=bonus6+400000*0.015;
printf(“请输入利润i:”);
scanf(“%f”,&i);
branch=(int)(i/100000);
case6:
case7:
case8:
case9:bonus=bonus6+(i-600000)*0.015;break;
otherwise:bonus=bonus10+(i-1000000)*0.01;
}
printf(“奖金是%10.2f\n”,bonus);
}
(2)分别输出如下图案。
(a)图案1的传统流程图(b)图案2的传统流程图