浙大版《C语言程序设计(第3版)》题目集前四章总结-续

时间:2022-02-11 19:19:51
练习4-11 统计素数并求和   (20分)

本题要求统计给定整数MMNN区间内素数的个数并对它们求和。

输入格式:

输入在一行中给出两个正整数MMNN1\le M\le N\le 5001MN500)。

输出格式:

在一行中顺序输出MMNN区间内素数的个数以及它们的和,数字间以空格分隔。


这个题目其实也不难,但是要注意m=n且不为素数的情况,这个时候素数的个数就应该是0,另外要排除输入为1的情况,1不是素数。下面是我的代码:



#include <stdio.h>
#include <math.h>
int main(void)
{
int m=0,n=0;
int count=0,sum=0;
double x=0;
scanf("%d %d",&m,&n);
for(int i=m;i<=n;i++)
{
x=sqrt(i);
int j=2;
for(;j<=x;j++)
{
if(i%j==0){
break;
}
}
if(j>x&&x!=1){
count++;
sum+=i;
}
}
printf("%d %d",count,sum);
return 0;
}




习题4-3 求分数序列前N项和   (15分)

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:

20

输出样例:

32.66
 
  • 时间限制:400ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:张彤彧
  • 单位:浙江大学

题目判定


这个题目其实也不难,但是有个地方要注意,就是当n过大的时候,分子和分母可能用int装不下,所以要定义成double类型,下面是我的代码:




#include <stdio.h>
int main(void)
{
int n=0;
scanf("%d",&n);
double fenzi=2,fenmu=1,t=0;
double sum=0;
for(int i=0;i<n;i++)
{
sum+=fenzi/fenmu;
t=fenzi;
fenzi=fenzi+fenmu;
fenmu=t;
}
printf("%0.2f",sum);
return 0;
}






习题4-6 水仙花数   (20分)

水仙花数是指一个NN位正整数(N\ge 3N3),它的每个位上的数字的NN次幂之和等于它本身。例如:153 = 1^3 + 5^3+ 3^3153=13+53+33。 本题要求编写程序,计算所有NN位水仙花数。

输入格式:

输入在一行中给出一个正整数NN3\le N\le 73N7)。

输出格式:

按递增顺序输出所有NN位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153
370
371
407
 
  • 时间限制:2500ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:徐镜春
  • 单位:浙江大学


如果没有时间的限制的话,这个题目其实非常简单,但是有时间限制,在n=7的时候会超过时间,当时也纠结了我很久,最后解决的办法就是我把pow函数自己写了一遍,没有调用 文件中的那个函数,就运行得快了一点,其实当时还想了一个办法就是:因为n=7的时候就是7位数,而7位数中如果有3个9,或者5个8的话就会超过7位,所以我找了一个变量来数,达到了就break,就不用循环这么多次了,但是发现时间更慢了..........另外就是我还看到有些人就是吧n=7的情况单独写了出来,对这个题目来说也是可以的。下面是我的代码:



#include <stdio.h>


int p(int a,int b);


int main(void)
{
int n=0,t=0;
scanf("%d",&n);
int m=p(10,n-1);
int v=p(10,n);


for(int i=m;i<v;i++)
{
int k=i;
int sum=0;
while(k>0){
t=k%10;
k=k/10;
sum+=p(t,n);
}


if(sum==i){
printf("%d\n",i);
}
}
return 0;
}


int p(int a,int b)
{
int t=a;
for(int i=1;i<b;i++)
a=a*t;
return a;
}





习题4-7 最大公约数和最小公倍数   (15分)

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:

输入在一行中给出两个正整数M和N(\le 10001000)。

输出格式:

在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:

511 292

输出样例:

73 2044
 
  • 时间限制:400ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:张彤彧
  • 单位:浙江大学


题目不难,要注意的是:m*n=最小公倍数*最大公约数,最大公约数用辗转相除法求就好,下面是我的代码:



#include <stdio.h>
int main(void)
{
int m=0,n=0,a=0,b=0;
scanf("%d %d",&m,&n);
int ji=m*n;
if(m>n)
{
a=n;
b=m;
}
else{
a=m;
b=n;
}
while(b%a!=0)
{
int t=b;
b=a;
a=t%a;
}
printf("%d %d",a,ji/a);
return 0;
}


习题4-8 高空坠球   (20分)

皮球从某给定高度*落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第nn次落地时,在空中一共经过多少距离?第nn次反弹的高度是多少?

输入格式:

输入在一行中给出两个非负整数,分别是皮球的初始高度和nn,均在长整型范围内。

输出格式:

在一行中顺序输出皮球第nn次落地时在空中经过的距离、以及第nn次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。

输入样例:

33 5

输出样例:

94.9 1.0
 
  • 时间限制:400ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:C课程组
  • 单位:浙江大学


题目不难,注意三个点就好了,1.是在空中经过的距离包括上升和下降的距离,而第一次和最后一次都只有下降没有上升。2.注意第n次落地前高度为0的情况 。3.当n=0时,反弹的高度和在空中经过的距离都为0;



#include <stdio.h>
int main(void)
{
int n=0,time=0;
double sum=0,h=0;
scanf("%lf %d",&h,&n);
while(h!=0&&time<n)
{
sum+=h;
time++;
h=h/2;
sum+=h;
}
if(n==0)
{
sum=0;
h=0;
}else{
sum=sum-h;
}


printf("%0.1f %0.1f",sum,h);
return  0;
}




习题4-9 打印菱形图案   (15分)

本题要求编写程序,打印一个高度为nn的、由“*”组成的正菱形图案。

输入格式:

输入在一行中给出一个正的奇数nn

输出格式:

输出由nn行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。

输入样例:

7

输出样例:

      * 
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
 
  • 时间限制:400ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:C课程组
  • 单位:浙江大学


题目分两个部分来做,上三角形和下三角形,上面那个三角形分空格和星形来输出,注意星型个数和行数的关系,下面是我的代码:



#include <stdio.h>
int main(void)
{
int n=0;
scanf("%d",&n);

int row=(n/2)+1;
for(int i=1;i<=row;i++)
{
for(int j=row-i;j>0;j--)
{
printf("  ");
}

for(int j=0;j<(2*i-1);j++)
{
printf("* ");
}
printf("\n");
}

for(int i=1;i<row;i++)
{
for(int j=0;j<i;j++)
{
printf("  ");
}

for(int j=(row-i)*2-1;j>0;j--)
{
printf("* ");
}
printf("\n");
}

return 0;
}




习题4-10 猴子吃桃问题   (15分)

一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第NN天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?

输入格式:

输入在一行中给出正整数NN1<N\le 101<N10)。

输出格式:

在一行中输出第一天共摘了多少个桃子。

输入样例:

3

输出样例:

10
 
  • 时间限制:400ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:徐镜春
  • 单位:浙江大学



题目其实也不难,要注意的是:上一次的总数是先加一再乘二得来的,并且第n天没有吃,所以是循环n-1次,下面是我的代码:



#include <stdio.h>
int main(void)
{
int n=0,x=1;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
x=(x+1)*2;
}
printf("%d",x);
return 0;
}






习题4-11 兔子繁衍问题   (15分)

一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到NN对?

输入格式:

输入在一行中给出一个不超过10000的正整数NN

输出格式:

在一行中输出兔子总数达到NN最少需要的月数。

输入样例:

30

输出样例:

9
 
  • 时间限制:400ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:徐镜春
  • 单位:浙江大学



对于这个题目.......(madan   我画图画了好久.......)其实就是斐波那契数组,就是从第三项开始后面的数是前面两个数的和,但是要注意的是输入的n不一定是斐波那契数组中的数,而且这个时候要取的是,达到n要用的最小月数,下面是我的代码:




#include <stdio.h>
int main(void)
{
int n=0,count=2,sum=0,x1=1,x2=1;
scanf("%d",&n);
if(n==1)
{
count=1;
}else{
while(sum<n){
sum=x1+x2;
count++; 
x1=x2;
x2=sum;
}
}
printf("%d",count);
return 0;
}