1. 程式人生 > >《PTA——C語言原始碼》之第1008題

《PTA——C語言原始碼》之第1008題

題目介紹

一個數組A中存有N(N&gt0)個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移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&gt0)個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移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