《c++程式設計》課程設計報告
- 輸入一個百分制的成績t,將其轉換成對應的等級,具體轉換規則如下:
90~100為A;
80~89為B;
70~79為C;
60~69為D;
0~59為E;
Input
輸入資料有多組,每組佔一行,由一個整陣列成。
Output
對於每組輸入資料,輸出一行。如果輸入資料不在0~100範圍內,請輸出一行:“Score is error!”。
題意:把在給定範圍內的數字轉化為給定的字母輸出,不在給定範圍內的輸出”Score is error”.
解題思路:此題非常簡單,是順序結構比較簡單的一類,按題目要求寫程式碼即可。
細節處理:沒有什麼細節需要特別處理。
原始碼:
#include
using namespace std;
int main()
{
int t; while(cin>>t) { if(t<0||t>100) cout<<"Score is error!"<<endl; else if(t>=90&&t<=100) cout<<"A"<<endl; else if(t>=80&&t<=89) cout<<"B"<<endl; else if(t>=70&&t<=79) cout<<"C"<<endl; else if(t>60&&t<=69) cout<<"D"<<endl; else if(t>=0&&t<=59) cout<<"E"<<endl; } return 0;
}
總結:此題目就是運用最開始所學的順序結構加上多組資料輸入的while迴圈即可。
- 給你n個整數,求他們中所有奇數的乘積。
Input
輸入資料包含多個測試例項,每個測試例項佔一行,每行的第一個數為n,表示本組資料一共有n個,接著是n個整數,你可以假設每組資料必定至少存在一個奇數。
Output
輸出每組數中的所有奇數的乘積,對於測試例項,輸出一行。
題意:把給定的一組數中所有奇數相乘,把所得到的數輸出即可。
解題思路:把所有的奇數找出來,用一個迴圈把所得到的奇數連乘,就得到了最後的結果。
細節處理:while,for後面別忘了加花括號,最後別忘了換行cout<<endl;
#include
using namespace std;
int main()
{
int n,i,a,temp;
while(scanf("%d",&n)==1)
{
a = 1;
for(i=0;i<n;i++)
{
scanf("%d",&temp);
if(temp%2) a*=temp;
}
printf("%d\n",a);
}
return 0;
}
總結:做這種需要先判斷奇和偶,然後再用迴圈把他們找出來即可,被忘了是多組資料輸入。
3.
Problem Description
有一個長度為n(n<=100)的數列,該數列定義為從2開始的遞增有序偶數,現在要求你按照順序每m個數求出一個平均值,如果最後不足m個,則以實際數量求平均值。程式設計輸出該平均值序列。
Input
輸入資料有多組,每組佔一行,包含兩個正整數n和m,n和m的含義如上所述。
Output
對於每組輸入資料,輸出一個平均值序列,每組輸出佔一行。
解題思路:每隔題目所給定的長度,將這些數求平均值,有一個公式,首項加所求平均值的個數減去一就是這m個數的平均數。
細節處理:如果最後的數不足m,還需要單獨拿出來計算。但公式和上面的一樣。
原始碼:
#include <stdio.h>
int main()
{
int n,m,a,b,c;
while (scanf("%d %d", &n, &m) != EOF)
{
b = n/m;
c = n%m;
a = 2;
for (int i = 0; i < b; i++)
{
if (i != 0)
printf(" ");
printf("%d", a + m - 1);
a = a + 2 * m;
}
if (c != 0)
printf(" %d", a + c - 1);
printf("\n");
}
return 0;
}
總結:像這樣的題需要找到它的規律,以便於根據規律來寫出計算他的式子,以此來快速解決問題。
- Problem Description
青年歌手大獎賽中,評委會給參賽選手打分。選手得分規則為去掉一個最高分和一個最低分,然後計算平均得分,請程式設計輸出某選手的得分。
Input
輸入資料有多組,每組佔一行,每行的第一個數是n(2<n<=100),表示評委的人數,然後是n個評委的打分。
Output
對於每組輸入資料,輸出選手的得分,結果保留2位小數,每組輸出佔一行。
解題思路:根據題目給出的資料,我們可以看出選手的得分是從大到小排好序的,因此不用我們從新排序,寫碼時去掉第一個資料和最後一個數據,求中間n-2個數據的平均值即可。
細節處理:別忘了最後輸出的是保留兩位小數,所以要用浮點數。別忘了標頭檔案!
原始碼:
#include
#include
using namespace std;
int main()
{
int n,i,x=0,max,min,a;
float s;
while(cin>>n)
{
max=0;
min=100;
x=0;
for(i=1;i<=n;i++)
{
cin>>a;
x+=a;
if(max<a)
{
max=a;
}
if(min>a)
{
min=a;
}
}
s=(x-max-min)*1.00/(n-2);
cout<<fixed<<setprecision(2)<<s<<endl;
}
return 0;
}
總結:做這個題需要把最大值最小值去掉,然後求平均值,不能忘了題目要求的浮點數,按自己的理解去寫就可以了。
- Font Size: ← →
Problem Description
有一頭母牛,它每年年初生一頭小母牛。每頭小母牛從第四個年頭開始,每年年初也生一頭小母牛。請程式設計實現在第n年的時候,共有多少頭母牛?
Input
輸入資料由多個測試例項組成,每個測試例項佔一行,包括一個整數n(0<n<55),n的含義如題目中描述。
n=0表示輸入資料的結束,不做處理。
Output
對於每個測試例項,輸出在第n年的時候母牛的數量。
每個輸出佔一行。
解題思路:因為小牛四年以後才會生,所以分類討論,當n<=4的時候,只有第一隻母牛會生,所以年數就是母牛數,n>4的時候小牛就開始生了,先把年數減去4,所以就找規律得到程式碼中的式子。
細節處理:記住分兩種情況!
原始碼:
#include
using namespace std;
int main()
{
int n;
while(cin>>n)
{
if(n==0)break;
int a,b,c,d;
if(n<=4)cout<<n<<endl;
else{
n=n-4;
a=b=c=d=1;
for(int i=0;i<n;i++)
{
d=c+d;
c=b;
b=a;
a=d;
}
cout<<a+b+c+d<<endl;
}
}
}
總結:像這一類的題也需要先找到規律,然後根據規律來寫出式子求出來即可。
Problem Description
輸入n(n<=100)個整數,按照絕對值從大到小排序後輸出。題目保證對於每一個測試例項,所有的數的絕對值都不相等。
Input
輸入資料有多組,每組佔一行,每行的第一個數字為n,接著是n個整數,n=0表示輸入資料的結束,不做處理。
Output
對於每個測試例項,輸出排序後的結果,兩個數之間用一個空格隔開。每個測試例項佔一行。
解題思路:因為是把絕對值作比較後絕對值從小到大的順序排列,所以用abs函式來求,然後比較絕對值得大小,再用sort函式排序後輸出。
細節處理:別忘了每個數之間的空格!
原始碼:
#include
#include
#include
using namespace std;
int com(int a,int b)
{
return abs(a)>abs(b);
}
int main()
{
int a[101],x,i;
while(cin>>i&&i!=0)
{
for(x=0;x<i;x++)
{
cin>>a[x];
}
sort(a,a+i,com);
for(x=0;x<i;x++)
{
cout<<a[x];
if(x!=i-1)
cout<<" ";
}
cout<<endl;
}
return 0;
}
總結:學會運用c++中比較好用的函式如sqrt求根符號,abs絕對值符號等等。
- Problem Description
有n(n<=100)個整數,已經按照從小到大順序排列好,現在另外給一個整數x,請將該數插入到序列中,並使新的序列仍然有序。
Input
輸入資料包含多個測試例項,每組資料由兩行組成,第一行是n和m,第二行是已經有序的n個數的數列。n和m同時為0標示輸入資料的結束,本行不做處理。
Output
對於每個測試例項,輸出插入新的元素後的數列。
解題思路:把所有的數輸進去之後,用sort函式排序,再輸出即可。
細節處理:sort(a,a+n+2)
原始碼:
#include
#include
using namespace std;
int a[110];
int main()
{
int n,m;
while(cin>>n>>m,!(n==0&&m==0))
{
for(int i=1;i<=n;i++)
cin>>a[i];
a[n+1]=m;
sort(a,a+n+2);
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<a[n+1]<<endl;
}
return 0;
}
總結:插入這種題,可以把所有資料都輸進去後再排序。
Problem Description
作為杭電的老師,最盼望的日子就是每月的8號了,因為這一天是發工資的日子,養家餬口就靠它了,呵呵
但是對於學校財務處的工作人員來說,這一天則是很忙碌的一天,財務處的小胡老師最近就在考慮一個問題:如果每個老師的工資額都知道,最少需要準備多少張人民幣,才能在給每位老師發工資的時候都不用老師找零呢?
這裡假設老師的工資都是正整數,單位元,人民幣一共有100元、50元、10元、5元、2元和1元六種。
Input
輸入資料包含多個測試例項,每個測試例項的第一行是一個整數n(n<100),表示老師的人數,然後是n個老師的工資。
n=0表示輸入的結束,不做處理。
Output
對於每個測試例項輸出一個整數x,表示至少需要準備的人民幣張數。每個輸出佔一行。
解題思路:把每一個數都從100-1來整除,然後求餘,依次往下迴圈!
細節處理:按照正常的思路把他給寫下來就行。
原始碼:
#include
using namespace std;
int main()
{
int n,a,sum=0,i;
while(cin>>n)
{
if(n==0)
break;
for(i=1;i<=n;i++)
{
cin>>a;
sum+=a/100;
a%=100;
sum+=a/50;
a%=50;
sum+=a/10;
a%=10;
sum+=a/5;
a%=5;
sum+=a/2;
a%=2;
sum+=a;
}
cout<<sum<<endl;
sum=0;
}
return 0;
}
總結:因為是整數,所以每一個面值都要求一遍。
Problem Description
“迴文串”是一個正讀和反讀都一樣的字串,比如“level”或者“noon”等等就是迴文串。請寫一個程式判斷讀入的字串是否是“迴文”。
Input
輸入包含多個測試例項,輸入資料的第一行是一個正整數n,表示測試例項的個數,後面緊跟著是n個字串。
Output
如果一個字串是迴文串,則輸出"yes",否則輸出"no".
解題思路:用字串把它給表示出來,用gets輸入,迴文串就是收尾字母相同,把他的長度len給表示出來,然後輸入開頭和末尾的字母,看看是否相等,如果不相等就結束no,相等就繼續,知道迴圈結束,說明是迴文串,輸出yes。
細節處理:分情況判斷是否是迴文序列,後別忘了往中間縮。
原始碼:
#include<stdio.h>
#include<string.h>
int main(){
int n,i,len,j;
char s[100];
scanf("%d",&n);
getchar();
while(n--){
gets(s);
len=strlen(s);
i=0;j=len-1;
while(i<j){
if(s[i]!=s[j])
break;
i++;
j--;
}
if(i>=j)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
總結:像這種輸字串的需要用長度strlen(s)來處理,這樣就十分方便簡要,程式碼也會很簡單。
Problem Description
這個題目的A和B不是簡單的整數,而是兩個時間,A和B 都是由3個整陣列成,分別表示時分秒,比如,假設A為34 45 56,就表示A所表示的時間是34小時 45分鐘 56秒。
Input
輸入資料有多行組成,首先是一個整數N,表示測試例項的個數,然後是N行資料,每行有6個整數AH,AM,AS,BH,BM,BS,分別表示時間A和B所對應的時分秒。題目保證所有的資料合法。
Output
對於每個測試例項,輸出A+B,每個輸出結果也是由時分秒3部分組成,同時也要滿足時間的規則(即:分和秒的取值範圍在0~59),每個輸出佔一行,並且所有的部分都可以用32位整數表示。
解題思路:因為是60進位制的,所以應該先從秒判斷,來確定最後時的數,然後輸出時再把時分秒給取餘,就得到了最後的結果。
細節處理:最後輸出的時候,別忘了求餘即可。
原始碼:
#include
using namespace std;
int main()
{
int N,AH,AM,AS,BH,BM,BS;
cin>>N;
while(N--)
{
cin>>AH>>AM>>AS>>BH>>BM>>BS;
BS+=AS;
BM+=(AM+BS/60);
BH+=(AH+BM/60);
cout<<BH<<" "<<(BM%60)<<" "<<(BS%60)<<endl;
}
return 0;
}
總結:這種題類似進位制問題,只要把他們加起來求餘就可以完成,這樣的題就可以這樣處理。
Input
每組輸入資料佔1行,每行資料的開始是2個整數n(0<=n<=100)和m(0<=m<=100),分別表示集合A和集合B的元素個數,然後緊跟著n+m個元素,前面n個元素屬於集合A,其餘的屬於集合B. 每個元素為不超出int範圍的整數,元素之間有一個空格隔開.
如果n=0並且m=0表示輸入的結束,不做處理。
Output
針對每組資料輸出一行資料,表示A-B的結果,如果結果為空集合,則輸出“NULL”,否則從小到大輸出結果,為了簡化問題,每個元素後面跟一個空格.
解題思路:把B中與A對應的元素找出來,然後把A中剩下的元素按從大到小的順序排出來,輸出,如果A中的元素每一個都能在B中找到,就輸出NULL。
細節處理:像這種分支比較多的程式,我們需要理清思路一步一步的寫,千萬不要把關係處理亂了,層次分明,條理清晰。
原始碼:
#include
#include
#include
using namespace std;
int main()
{
int a[100], b[100], judge[100];
int i, j, k;
int n, m;
while (scanf("%d%d", &n, &m) != EOF)
{
int flag[100] = { 0 }, num = 0;
if (m == n&&m == 0)
{
return 0;
}
else
{
for (i = 0; i < n; i++)
{
cin >> a[i];
}
for (i = 0; i < m; i++)
{
cin >> b[i];
}
for (j = 0; j < n; j++)
{
for (k = 0; k < m; k++)
{
if (a[j] == b[k])
{
flag[j] = 1;
}
}
}
for (i = 0; i < n; i++)
{
if (flag[i] != 1)
{
sort(a, a + n);
cout << a[i] << " ";
judge[num++] = a[i];
}
}
if (num == 0)
{
cout << "NULL";
}
cout << endl;
}
}
}
總結:這樣的程式應定要認真仔細的一步一步寫,如果中間錯一點就全錯了,所以要明確步驟,一步一步的寫。
Font Size: ← →
Problem Description
求A^B的最後三位數表示的整數。
說明:A^B的含義是“A的B次方”
Input
輸入資料包含多個測試例項,每個例項佔一行,由兩個正整數A和B組成(1<=A,B<=10000),如果A=0, B=0,則表示輸入資料的結束,不做處理。
Output
對於每個測試例項,請輸出A^B的最後三位表示的整數,每個輸出佔一行。
解題思路:對於這種超級簡單的題就沒有啥特別的思路,就是按套路寫,把給定的兩個數乘出來然後出去1000求餘,輸出餘數即可;
細節處理:沒啥細節。
原始碼:
#include
using namespace std;
int main()
{
int a,b,x,i;
while(cin>>a>>b,a!=0||b!=0)
{
x=1;
for(i=1;i<=b;i++)
x=(a*x)%1000;
cout<<x<<endl;
}
return 0;
}
總結:一個非常常規的迴圈語句,按套路寫就可以。
Problem Description
喜歡西遊記的同學肯定都知道悟空偷吃蟠桃的故事,你們一定都覺得這猴子太鬧騰了,其實你們是有所不知:悟空是在研究一個數學問題!
什麼問題?他研究的問題是蟠桃一共有多少個!
不過,到最後,他還是沒能解決這個難題,呵呵-
當時的情況是這樣的:
第一天悟空吃掉桃子總數一半多一個,第二天又將剩下的桃子吃掉一半多一個,以後每天吃掉前一天剩下的一半多一個,到第n天準備吃的時候只剩下一個桃子。聰明的你,請幫悟空算一下,他第一天開始吃的時候桃子一共有多少個呢?
Input
輸入資料有多組,每組佔一行,包含一個正整數n(1<n<30),表示只剩下一個桃子的時候是在第n天發生的。
Output
對於每組輸入資料,輸出第一天開始吃的時候桃子的總數,每個測試例項佔一行。
解題思路:找到猴子吃桃的規律,然後倒著用迴圈語句把規律用式子表示出來即可,反正我是用手推出來的!
細節處理:每輸入一組資料之後,別忘了把y變成1,否則就會一直加下去,這樣的話第二組資料數出來的結果就是錯的.
原始碼:
#include
using namespace std;
int main()
{
int y=1,i,n,s=0;
while(cin>>n)
{
for(i=1;i<n;i++)
{
s=(y+1)*2;
y=s;
}
cout<<s;
cout<<endl;
s=0;
y=1;
}
return 0;
}
總結:像這種題目需要先把它的規律找出來,然後尋找式子把他給表示出來,然後用一個迴圈就可以完成了,有一些麻煩的會多組迴圈,但也不影響。
Problem Description
有一樓梯共M級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第M級,共有多少種走法?
Input
輸入資料首先包含一個整數N,表示測試例項的個數,然後是N行資料,每行包含一個整數M(1<=M<=40),表示樓梯的級數。
Output
對於每個測試例項,請輸出不同走法的數量
解題思路:先把前走向前三級的資料給表示出來,然後從第四個臺階開始,每一級臺階的走法,就是前兩個臺階走法的加和,用迴圈把它給表示出來,然後輸出題目所給的結果即可。
細節處理:記得每輸入一組資料就要換行。
原始碼:
#include
using namespace std;
int main()
{
int N,i,n;
int a[1000];
cin>>N;
while(N--)
{
cin>>n;
a[1]=0;
a[2]=1;
a[3]=2;
for(i=4;i<=n;i++)
{
a[i]=a[i-1]+a[i-2];
}
cout<<a[n];
cout<<endl;
}
return 0;
}
總結:想此類題目,需要仔細審題然後把其中的規律找出來,找到一個固定的式子,然後用迴圈把他給表示出來即可。
- Problem Description
一個整數,只知道前幾位,不知道末二位,被另一個整數除盡了,那麼該數的末二位該是什麼呢?
Input
輸入資料有若干組,每組資料包含二個整數a,b(0<a<10000, 10<b<100),若遇到0 0則處理結束。
Output
對應每組資料,將滿足條件的所有尾數在一行內輸出,格式見樣本輸出。同組資料的輸出,其每個尾數之間空一格,行末沒有空格。
解題思路:這個題目就比較有意思了,我比較喜歡,根據題意來說這樣的兩位數有可能不止一組,所以我們就從0開始到99,一個一個數來試,如果在10以內出現的兩位數,就得先輸出一個零,再輸出個位數,如果出現兩個以上的兩位數,就要輸入空格,這就需要用if語句來判斷,最後輸出所有能被整除的結果。
細節處理:每一組資料完成以後需要把k變回零,否則就會影響下一組的結果。
原始碼:
#include
using namespace std;
int main()
{
int a,b,s,i,j,k=0;
while(cin>>a>>b)
{
if(a==0&&b==0)
break;
s=0;
for(i=0;i<=99;i++)
{
j=a*100+i;
if(j%b==0)
{
if(k!=0)
{
cout<<" ";
}
if(i<10)
{
cout<<"0";
cout<<i;
}
else
{
cout<<i;
}
k++;
}
}
cout<<endl;
k=0;
}
return 0;
}
總結:處理這一類問題一定要理清思路不要亂,就算是一個空格沒有處理好,在這個程式也是錯的,所以,做這種題的時候一定要仔細,層次清晰調理。