day14:數組綜合練習
2034:【例5.1】反序輸出
【題目描述】
輸入n個數,要求程序按輸入時的逆序把這n個數打印出來,
已知整數不超過100個。也就是說,按輸入相反順序打印這n個數。
【輸入】輸入一行共有n個數,每個數之間用空格隔開。
【輸出】如題要求:一行,共有n個數,每個數之間用一個空格隔開。
【輸入樣例】1 7 3 4 5
【輸出樣例】5 4 3 7 1
【題解】
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e4;
int a[N], i=0;
int main() {
while(scanf("%d", &a[++i])!=EOF);//輸入判斷的一種模板,EOF=-1
for( i=i-1; i>=1; i--) printf("%d ", a[i]);
return 0;
}
2035:【例5.2】平移數據
【題目描述】
將a數組中第一個元素移到數組末尾,其余數據依次往前平移一個位置。
【輸入】
第一行為數組a的元素個數;
第二行為n個小於1000的正整數。
【輸出】
平移后的數組元素,每個數用一個空格隔開。
【輸入樣例】
10
1 2 3 4 5 6 7 8 9 10
【輸出樣例】
2 3 4 5 6 7 8 9 10 1
【題解】
#include<iostream>
using namespace std;
const int N=1e4;
int a[N];
int main() {
int n; cin>>n;
for(int i=0; i<n; i++) cin>>a[i];
int temp=a[0];
for(int i=0; i<n; i++){
a[i]=a[i+1];
}
a[n-1]=temp;
for(int i=0; i<n; i++) cout<<a[i]<<" ";
return 0;
}
2036:【例5.3】開關門
【題目描述】
賓館里有n(2≤n≤1000)個房間,從1~n編了號。
第一個服務員把所有的房間門都打開了,
第二個服務員把所有編號是2的倍數的房間“相反處理”,
第三個服務員把所有編號是3的倍數的房間作“相反處理”…,
以后每個服務員都是如此。
當第n個服務員來過后,哪幾扇門是打開的。
(所謂“相反處理”是:原來開着的門關上,原來關上的門打開。)
【輸入】房間數n。
【輸出】一行,由小到大的打開門的房間序號,各序號之間用一個空格隔開。
【輸入樣例】100
【輸出樣例】1 4 9 16 25 36 49 64 81 100
【題解】
#include<iostream>
using namespace std;
const int N=1e4;
bool a[N];//0 關, 1 開
int main() {
int n=100; cin>>n;
for(int i=1; i<=n; i++){
for(int j=i; j<=n; j++){
if(j%i==0) a[j]=!a[j];//邏輯取反
}
}
for(int i=1; i<=n; i++){
if(a[i]==1) cout<<i<<" ";
}
return 0;
}
2037:【例5.4】約瑟夫問題
【題目描述】
N個人圍成一圈,從第一個人開始報數,數到M的人出圈;
再由下一個人開始報數,數到M的人出圈;…
輸出依次出圈的人的編號。
【輸入】輸入N和M。
【輸出】輸出一行,依次出圈的人的編號。
【輸入樣例】8 5
【輸出樣例】5 2 8 7 1 4 6 3
【數據范圍】對於所有數據,2≤N,M≤1000。
【題解】
#include<iostream>
using namespace std;
const int N=1e4;
bool a[N];// 0 未出圈, 1 已出圈
int b[N];// 出圈順序
int main() {
int n=8,m=5; cin>>n>>m;
int cnt=0,k=0,i=0;
while(cnt<n) { //全部出圈才結束
i++;
if(i>n) i=1;//隊列人數報完,從頭繼續報數
if(a[i]==0) k++; //報數
if(k==m) b[++cnt]=i, k=0, a[i]=1;//出圈
}
for(int i=1; i<=n; i++) cout<<b[i]<<" ";
return 0;
}
2038:【例5.5】最大數位置
【題目描述】
輸入n個整數,存放在數組a[1]至a[n]中,輸出最大數所在位置(n≤1000)。
【輸入】
第一行,數的個數n;
第二行,n個正整數,每個數在2^32-1之內。
【輸出】
最大數所在位置。
【輸入樣例】
5
67 43 90 78 32
【輸出樣例】
3
【題解】
#include<iostream>
using namespace std;
const int N=1e4;
long long a[N];
int main() {
long long n, maxn=-1, maxn_i=-1; cin>>n;
for(int i=1; i<=n; i++){
cin>>a[i];
if(maxn<a[i]) maxn=a[i], maxn_i=i;
}
cout<<maxn_i;
return 0;
}
2039:【例5.6】冒泡排序
【題目描述】
編程輸入n(1≤n≤20)個小於1000非負整數,然后自動按從大到小的順序輸出。(冒泡排序)
【輸入】
第一行,數的個數n;
第二行,n個非負整數。
【輸出】
由大到小的n個非負整數,每個數占一行。
【輸入樣例】
5
2 5 8 6 12
【輸出樣例】
12
8
6
5
2
【題解】
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e4;
int a[N];
int main() {
int n; cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
for(int i=1; i<=n; i++){
for(int j=1; j<=n-i; j++){
if(a[j]<a[j+1]){//冒泡-每次比較相鄰的兩個元素
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for(int i=1; i<=n; i++){
cout<<a[i]<<endl;
}
return 0;
}
2040:【例5.7】篩選法找質數
【題目描述】
用篩法求出n(2≤n≤1000)以內的全部質數。
【輸入】輸入n。
【輸出】多行,由小到大的質數。
【輸入樣例】
10
【輸出樣例】
2
3
5
7
【題解】
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e4;
int primes[N], cnt=0;
int main() {
int n; cin>>n;
for(int i=2; i<=n; i++){
bool flag=1;
for(int j=2; j<i; j++){
if(i%j==0){
flag=0; break;
}
}
if(flag==1) primes[++cnt]=i;
}
for(int i=1; i<=cnt; i++){
cout<<primes[i]<<endl;
}
return 0;
}
1102:與指定數字相同的數的個數
【題目描述】
輸出一個整數序列中與指定數字相同的數的個數。
【輸入】
輸入包含三行:
第一行為n,表示整數序列的長度(n≤100);
第二行為n個整數,整數之間以一個空格分開;
第三行包含一個整數,為指定的數字m。
【輸出】
輸出為n個數中與m相同的數的個數。
【輸入樣例】
3
2 3 2
2
【輸出樣例】
2
【題解】
#include<iostream>
using namespace std;
const int N=1e4;
int a[N], cnt=0;
int main() {
int n; cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
int x; cin>>x;
for(int i=1; i<=n; i++){
if(x==a[i]) cnt++;
}
cout<<cnt;
return 0;
}
1103:陶陶摘蘋果
【題目描述】
陶陶家的院子里有一棵蘋果樹,每到秋天樹上就會結出10個蘋果。
蘋果成熟的時候,陶陶就會跑去摘蘋果。
陶陶有個30厘米高的板凳,當她不能直接用手摘到蘋果的時候,就會踩到板凳上再試試。
現在已知10個蘋果到地面的高度,以及陶陶把手伸直的時候能夠達到的最大高度,
請幫陶陶算一下她能夠摘到的蘋果的數目。假設她碰到蘋果,蘋果就會掉下來。
【輸入】
包括兩行數據。第一行包含10個100到200之間(包括100和200)的整數(以厘米為單位)
分別表示10個蘋果到地面的高度,兩個相鄰的整數之間用一個空格隔開。
第二行只包括一個100到120之間(包含100和120)的整數(以厘米為單位),
表示陶陶把手伸直的時候能夠達到的最大高度。
【輸出】
包括一行,這一行只包含一個整數,表示陶陶能夠摘到的蘋果的數目。
【輸入樣例】
100 200 150 140 129 134 167 198 200 111
110
【輸出樣例】
5
【題解】
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e4;
int a[N], cnt=0;
int main() {
for(int i=1; i<=10; i++) cin>>a[i];
int h; cin>>h;
for(int i=1; i<=10; i++){
if(a[i]<=h+30) cnt++;
}
cout<<cnt;
return 0;
}
1104:計算書費
【題目描述】
下面是一個圖書的單價表:
計算概論 28.9元/本
數據結構與算法 32.7元/本
數字邏輯 45.6元/本
C++程序設計教程 78元/本
人工智能 35 元/本
計算機體系結構 86.2元/本
編譯原理 27.8元/本
操作系統 43元/本
計算機網絡 56元/本
JAVA程序設計 65元/本
給定每種圖書購買的數量,編程計算應付的總費用。
【輸入】
輸入一行,包含10個整數(大於等於0,小於等於100),分別表示購買的《計算概論》、《數據結構與算法》、《數字邏輯》、《C++程序設計教程》、《人工智能》、《計算機體系結構》、《編譯原理》、《操作系統》、《計算機網絡》、《JAVA程序設計》的數量(以本為單位)。每兩個整數用一個空格分開。
【輸出】
輸出一行,包含一個浮點數f,表示應付的總費用。精確到小數點后一位。
【輸入樣例】1 5 8 10 5 1 1 2 3 4
【輸出樣例】2140.2
【題解】
#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;
const int N=1e4;
double a[N]={28.9,32.7,45.6,78,35,86.2,27.8,43,56,65}, money=0;
int main() {
for(int i=0; i<10; i++) {
int num; cin>>num;
money += a[i]*num;
}
cout<<fixed<<setprecision(1)<<money<<endl;
// printf("%.1lf",money);
return 0;
}
1105:數組逆序重存放
【題目描述】
將一個數組中的值按逆序重新存放。例如,原來的順序為8,6,5,4,1。要求改為1,4,5,6,8。
【輸入】
兩行:第一行數組中元素的個數n(1<n<100),第二行是n個整數,每兩個整數之間用空格分隔。
【輸出】
一行:輸出逆序后數組的整數,每兩個整數之間用空格分隔。
【輸入樣例】
5
8 6 5 4 1
【輸出樣例】
1 4 5 6 8
【題解】
#include<iostream>
using namespace std;
const int N=1e4;
int a[N];
int main() {
int n; cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
for(int i=n; i>=1; i--) cout<<a[i]<<" ";
return 0;
}
1106:年齡與疾病
【題目描述】
某醫院想統計一下某項疾病的獲得與否與年齡是否有關,需要對以前的診斷記錄進行整理,按照0-18、19-35、36-60、61以上(含61)四個年齡段統計的患病人數占總患病人數的比例。
【輸入】
共2行,第一行為過往病人的數目n(0<n<=100),第二行為每個病人患病時的年齡。
【輸出】
按照0-18、19-35、36-60、61以上(含61)四個年齡段輸出該段患病人數占總患病人數的比例,以百分比的形式輸出,精確到小數點后兩位。每個年齡段占一行,共四行。
【輸入樣例】
10
1 11 21 31 41 51 61 71 81 91
【輸出樣例】
20.00%
20.00%
20.00%
40.00%
【題解】
#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;
const int N=1e4;
int a[N];
int main() {
int n; cin>>n;
for(int i=1; i<=n; i++){
int age; cin>>age;
if(age<=18) a[1]++;
else if(age<=35) a[2]++;
else if(age<=60) a[3]++;
else a[4]++;
}
for(int i=1; i<=4; i++){
cout<<fixed<<setprecision(2)<<100.0*a[i]/n<<"%"<<endl;
// printf("%.2lf%\n", 100.0*a[i]/n);
}
return 0;
}
1107:校門外的樹
【題目描述】
某校大門外長度為L的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1米。
我們可以把馬路看成一個數軸,馬路的一端在數軸0的位置,另一端在L的位置;
數軸上的每個整數點,即0,1,2,……,L,都種有一棵樹。
由於馬路上有一些區域要用來建地鐵。
這些區域用它們在數軸上的起始點和終止點表示。
已知任一區域的起始點和終止點的坐標都是整數,區域之間可能有重合的部分。
現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。
你的任務是計算將這些樹都移走后,馬路上還有多少棵樹。
【輸入】
第一行有兩個整數L(1 ≤ L ≤ 10000)和 M(1 ≤ M ≤ 100),
L代表馬路的長度,M代表區域的數目,L和M之間用一個空格隔開。
接下來的M行每行包含兩個不同的整數,用一個空格隔開,表示一個區域的起始點和終止點的坐標。
對於20%的數據,區域之間沒有重合的部分;對於其它的數據,區域之間有重合的情況。
【輸出】
包括一行,這一行只包含一個整數,表示馬路上剩余的樹的數目。
【輸入樣例】
500 3
150 300
100 200
470 471
【輸出樣例】
298
【題解】
#include<iostream>
using namespace std;
const int N=1e4;
int a[N], cnt=0;// 0 表示有樹,1表示無樹
int main() {
int l,m; cin>>l>>m;
for(int i=1; i<=m; i++){
int u,v; cin>>u>>v;
for(int j=u; j<=v; j++){
a[j]=1;//樹被移栽
}
}
for(int i=0; i<=l; i++){
if(a[i]==0) cnt++;
}
cout<<cnt;
return 0;
}
1108:向量點積計算
【題目描述】
在線性代數、計算幾何中,向量點積是一種十分重要的運算。
給定兩個n維向量a=(a1,a2,...,an)和b=(b1,b2,...,bn),
求點積axb=a1xb1+a2xb2+...+anxbn。
【輸入】
第一行是一個整數n(1≤n≤1000);
第二行包含n個整數a1,a2,...,an;
第三行包含n個整數b1,b2,...,bn;
相鄰整數之間用單個空格隔開。每個整數的絕對值都不超過1000。
【輸出】
一個整數,即兩個向量的點積結果。
【輸入樣例】
3
1 4 6
2 1 5
【輸出樣例】
36
【題解】
#include<iostream>
using namespace std;
const int N=1e4;
int a[N], b[N], ans=0;
int main() {
int n; cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
for(int i=1; i<=n; i++) cin>>b[i];
for(int i=1; i<=n; i++) ans += a[i]*b[i];
cout<<ans;
return 0;
}
1109:開關燈
【題目描述】
假設有N盞燈(N為不大於5000的正整數),從1到N按順序依次編號,
初始時全部處於開啟狀態;有M個人(M為不大於N的正整數)也從1到M依次編號。
第一個人(1號)將燈全部關閉,第二個人(2號)將編號為2的倍數的燈打開,
第三個人(3號)將編號為3的倍數的燈做相反處理(即將打開的燈關閉,將關閉的燈打開)。
依照編號遞增順序,以后的人都和3號一樣,將凡是自己編號倍數的燈做相反處理。
請問:當第M個人操作之后,哪幾盞燈是關閉的,
按從小到大輸出其編號,其間用逗號間隔。
【輸入】輸入正整數N和M,以單個空格隔開。
【輸出】順次輸出關閉的燈的編號,其間用逗號間隔。
【輸入樣例】10 10
【輸出樣例】1,4,9
【題解】
#include<iostream>
using namespace std;
const int N=1e4;
bool a[N], flag=0;// 0 表示關閉, 1表示開啟
int main() {
int n=10,m=10; cin>>n>>m;
for(int i=2; i<=m; i++){
for(int j=i; j<=n; j++){
if(j%i==0) a[j]=!a[j];
}
}
for(int i=1; i<=n; i++){
if(a[i]==0){
if(flag==0) flag=1, cout<<i;
else cout<<","<<i;
}
}
return 0;
}
1110:查找特定的值
【題目描述】
在一個序列(下標從1開始)中查找一個給定的值,輸出第一次出現的位置。
【輸入】
第一行包含一個正整數n,表示序列中元素個數。1 <=n<= 10000。
第二行包含n個整數,依次給出序列的每個元素,相鄰兩個整數之間用單個空格隔開。元素的絕對值不超過10000。
第三行包含一個整數x,為需要查找的特定值。x的絕對值不超過10000。
【輸出】
若序列中存在x,輸出x第一次出現的下標;否則輸出-1。
【輸入樣例】
5
2 3 6 7 3
3
【輸出樣例】
2
【題解】
#include<iostream>
using namespace std;
const int N=1e4;
int a[N];
int main() {
int n; cin>>n;
for(int i=0; i<n; i++) cin>>a[i];
for(int i=0; i<n; i++){
if(a[i]==x) {
cout<<i+1; return 0;//結束程序
}
}
cout<<-1;
return 0;
}