《PTA——C語言原始碼》之第1008題
題目介紹
一個數組A中存有N(N>0)個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移M(M>=0)個位置,即將A中的資料由(A~0~ A~1~……A~N-1~)變換為(A~N-M~ …… A~N-1~ A~0~ A~1~……A~N-M-1~)(最後M個數迴圈移至最前面的M個位置)。如果需要考慮程式移動資料的次數儘量少,要如何設計移動的方法?
輸入格式:每個輸入包含一個測試用例,第1行輸入N ( 1<=N<=100)、M(M>=0);第2行輸入N個整數,之間用空格分隔。
輸出格式:在一行中輸出迴圈右移M位以後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。
輸入樣例:
6 2 1 2 3 4 5 6
輸出樣例:
5 6 1 2 3 4
原始碼
#include<stdio.h>
#define MAXSIZE 101
void move(int A[], int N, int M){
for(; M < N - 1; ++M){
A[N-M] = A[N-M-1];
}
A[1] = A[0];
}
int main(){
int N, M, A[MAXSIZE]={0}; //A[0]用來儲存需要移動的元素
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; ++i){
scanf("%d", &A[i]);
}
M = M % N; //極其重要
if(N == M){
for(int i = N; i >= 1; --i){
if( i == 1 )
printf("%d", A[i]);
else printf("%d ", A[i]);
}
}
else {
for(int i = 1; i <= M;++i){
A[0] = A[N - i + 1];
A[N - i + 1 ] = A[N - M];
move(A, N, M);
}
for(int i = 1; i <= N; ++i){
if( i == N )
printf("%d", A[i]);
else printf("%d ", A[i]);
}
}
return 0;
}
知識分析
思路
拿到此題後的思路為,開闢一個數組大小為N+1,A[0]用來儲存元素,下標1——N則為陣列正常元素。要移動M個元素,先將最後一個值拿出來儲存,然後陣列其他的元素往後移動N-M個位置,最後將拿出來的元素放到A[0]即可。具體思路如下:
1. 最後一個元素A[N]賦值給A[0];
2. 令A[N - i + 1] = A[N - M];這樣做的目的是將移動M個元素分解為移動1個元素。//晚點用好一點的術語描述,1≤i≤M;
3. 將A[1]到A[N-M]的值均往後移1位;移動完畢之後A[1] = A[0]
4. 重複上述3個步驟,直至i == M即可。
出錯分析
M = M % N; //極其重要
if(N == M){
for(int i = N; i >= 1; --i){
if( i == 1 )
printf("%d", A[i]);
else printf("%d ", A[i]);
}
}
提交完整的正確答案之前沒有考慮極端情況,即
1. M>N的時候,此時應該對N求模。
2. M==N的時候,直接倒序輸出即可。
相關推薦
《PTA——C語言原始碼》之第1008題
題目介紹 一個數組A中存有N(N>0)個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移M(M>=0)個位置,即將A中的資料由(A~0~ A~1~……A~N-1~)變換為(A~N-M~ …… A~N-1~ A~0~ A~1~……A
第七屆藍橋杯 湊算式 C語言 B組第三題
湊算式 B DEF A + --- + ------- = 10 C GHI (如果顯示有問題,可以參見【圖1.jpg】) 這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。 比如: 6
2018省賽第九屆藍橋杯真題C語言B組第九題題解 全球變暖
標題:全球變暖你有一張某海域NxN畫素的照片,"."表示海洋、"#"表示陸地,如下所示:........##.....##........##...####....###........其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。 由於全
2018省賽第九屆藍橋杯真題C語言B組第八題題解 日誌統計
標題:日誌統計小明維護著一個程式設計師論壇。現在他收集了一份"點贊"日誌,日誌共有N行。其中每一行的格式是:ts id 表示在ts時刻編號id的帖子收到一個"贊"。 現在小明想統計有哪些帖子曾經是"熱帖"。如果一個帖子曾在任意一個長度為D的時間段內收到不少於K個贊,小明就
2018 藍橋杯 省賽 B組 原題 C語言B組 第8題 第九屆藍橋杯真題 日誌統計
標題:日誌統計小明維護著一個程式設計師論壇。現在他收集了一份"點贊"日誌,日誌共有N行。其中每一行的格式是:ts id 表示在ts時刻編號id的帖子收到一個"贊"。 現在小明想統計有哪些帖子曾經是"熱帖"。如果一個帖子曾在任意一個長度為D的時間段內收到不少於K個贊,小明就
大臣的旅費——第四屆藍橋杯省賽C語言A組第10題
問題描述 很久以前,T王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。 為節省經費,T國的大臣們經過思考,制定了一套優秀的修建方案,使得任何一個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達
取球遊戲——第三屆藍橋杯省賽C語言A組第10題
今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 每個人從盒子中取出的球的數目必須是:1,3,7或者8個。 輪到某一方取球時不能棄權! A先取球,然後雙方交替取球,直
逆波蘭表示式——第四屆藍橋杯省賽C語言A組第6題
正常的表示式稱為中綴表示式,運算子在中間,主要是給人閱讀的,機器求解並不方便。 例如:3 + 5 * (2 + 6) - 1 而且,常常需要用括號來改變運算次序。 相反,如果使用逆波蘭表示式(字首表示式)表示,上面的算式則表示為: - + 3 * 5 + 2 6 1 不再需
2018省賽第九屆藍橋杯真題C語言B組第六題題解 遞增三元組
標題:遞增三元組給定三個整數陣列A = [A1, A2, ... AN], B = [B1, B2, ... BN], C = [C1, C2, ... CN],請你統計有多少個三元組(i, j, k) 滿足:1. 1 <= i, j, k <= N 2. Ai
2018第九屆藍橋杯省賽真題 C語言B組 第六題 遞增三元組
標題:遞增三元組 給定三個整數陣列 A = [A1, A2, … AN], B = [B1, B2, … BN], C = [C1, C2, … CN], 請你統計有多少個三元組(i, j,
c語言學習之選擇結構程序設計(第三天)
c語言 選擇結構為了增加理解,寫的幾個小程序1:判斷三角形的成立以及輸出最大邊 練習前三種語句#include <stdio.h> int main() { int a,b,c; printf("請輸入三角形三邊長(邊為整數,不能輸入負數):"); scanf("%d%d%d", &a ,
C語言程式設計(第三版) 第六章 實驗題 2 任務4
#include <iostream> #include<iomanip> #include<time.h> using namespace std; int main() { int flag,n1; char m; double i=0,a=0,
C語言程式設計(第三版) 第六章 實驗題 2 任務6
#include <iostream> #include<iomanip> #include<time.h> using namespace std; int main() { int flag,n1,n2; char m; double i=0,l
浙大版《C語言程式設計(第3版)》題目集(函式題)練習5-1
練習5-1 求m到n之和(10 分) 本題要求實現一個計算m~n(m 函式介面定義: int sum( int m, int n ); 其中m和n是使用者傳入的引數,保證有m < n。
浙大版《C語言程式設計(第3版)》題目集(函式題)練習5-3
練習5-3 數字金字塔(15 分) 本題要求實現函式輸出n行數字金字塔。 函式介面定義: void pyramid( int n ); 其中n是使用者傳入的引數,為[1, 9]的正整數。
2018年第九屆藍橋杯C語言B組答案第二題:明碼
標題:明碼漢字的字形存在於字型檔中,即便在今天,16點陣的字型檔也仍然使用廣泛。16點陣的字型檔把每個漢字看成是16x16個畫素資訊。並把這些資訊記錄在位元組中。一個位元組可以儲存8位資訊,用32個位元組就可以存一個漢字的字形了。把每個位元組轉為2進製表示,1表示墨跡,0表示
第七屆藍橋杯大賽個人賽省賽(軟體類 C語言b組)真題 (個人解題思路)
1.煤球數目有一堆煤球,堆成三角稜錐形。具體:第一層放1個,第二層3個(排列成三角形),第三層6個(排列成三角形),第四層10個(排列成三角形),....如果一共有100層,共有多少個煤球?請填表示煤球總數目的數字。注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性
浙大版《C語言程式設計(第3版)》題目集(函式題)習題5-1
習題5-1 符號函式(10 分) 本題要求實現符號函式sign(x)。 函式介面定義: int sign( int x ); 其中x是使用者傳入的整型引數。符號函式的定義為:若x大於0,
譚浩強C語言程式設計(第三版)部分課後題答案,自己整理的
第一篇部落格,也不知道怎麼寫,就把以前的筆記發上來吧 學了半年後寫的,可能稍顯不規範,或有的多餘,將就看吧,也不想再改了 1.5 #include<stdio.h> void main() {printf("******************\n");pr
c語言坑之printf緩沖區
tail multiply out ack splay 一次 fin eof lan 1 #include <stdio.h> 2 #include <pthread.h> 3 #include <semaphore.h> 4