1. 程式人生 > >浙大版《C語言程式設計(第3版)》題目集前四章總結-續

浙大版《C語言程式設計(第3版)》題目集前四章總結-續

練習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^3

153=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;
}