day14:數組綜合練習


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM