浙大版《C語言程式設計(第3版)》題目集前四章總結-續
本題要求統計給定整數M和N區間內素數的個數並對它們求和。
輸入格式:
輸入在一行中給出兩個正整數M和N(1≤M≤N≤500)。
輸出格式:
在一行中順序輸出M和N區間內素數的個數以及它們的和,數字間以空格分隔。
這個題目其實也不難,但是要注意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;
}
本題要求編寫程式,計算序列 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;
}
水仙花數是指一個N位正整數(N≥3),它的每個位上的數字的N次冪之和等於它本身。例如:
輸入格式:
輸入在一行中給出一個正整數N(3≤N≤7)。
輸出格式:
按遞增順序輸出所有N位水仙花數,每個數字佔一行。
輸入樣例:
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;
}
本題要求兩個給定正整數的最大公約數和最小公倍數。
輸入格式:
輸入在一行中給出兩個正整數M和N(≤1000)。
輸出格式:
在一行中順序輸出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;
}
皮球從某給定高度自由落下,觸地後反彈到原高度的一半,再落下,再反彈,……,如此反覆。問皮球在第n次落地時,在空中一共經過多少距離?第n次反彈的高度是多少?
輸入格式:
輸入在一行中給出兩個非負整數,分別是皮球的初始高度和n,均在長整型範圍內。
輸出格式:
在一行中順序輸出皮球第n次落地時在空中經過的距離、以及第n次反彈的高度,其間以一個空格分隔,保留一位小數。題目保證計算結果不超過雙精度範圍。
輸入樣例:
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;
}
本題要求編寫程式,列印一個高度為n的、由“*”組成的正菱形圖案。
輸入格式:
輸入在一行中給出一個正的奇數n。
輸出格式:
輸出由n行星號“*”組成的菱形,如樣例所示。每個星號後跟一個空格。
輸入樣例:
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;
}
一隻猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個;第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半加一個。到第N天早上想再吃時,見只剩下一個桃子了。問:第一天共摘了多少個桃子?
輸入格式:
輸入在一行中給出正整數N(1<N≤10)。
輸出格式:
在一行中輸出第一天共摘了多少個桃子。
輸入樣例:
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;
}
一對兔子,從出生後第3個月起每個月都生一對兔子。小兔子長到第3個月後每個月又生一對兔子。假如兔子都不死,請問第1個月出生的一對兔子,至少需要繁衍到第幾個月時兔子總數才可以達到N對?
輸入格式:
輸入在一行中給出一個不超過10000的正整數N。
輸出格式:
在一行中輸出兔子總數達到N最少需要的月數。
輸入樣例:
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;
}