一天兩道pat(3)1007,1008


1007沒什么好說的,就是注意暴力求素數的時候,循環到(根號n)+1就好;

重點說說1008,不用新開一個數組就實現循環移位的操作

一個數組A中存有N(>0)個整數,在不允許使用另外數組的前提下,將每個整數循環向右移M(0)個位置,即將A中的數據由(A0​​A1​​AN1​​)變換為(ANM​​AN1​​A0​​A1​​ANM1​​)(最后M個數循環移至最前面的M個位置)。如果需要考慮程序移動數據的次數盡量少,要如何設計移動的方法?

輸入格式:

每個輸入包含一個測試用例,第1行輸入N(1N100)和M(0);第2行輸入N個整數,之間用空格分隔。

輸出格式:

在一行中輸出循環右移M位以后的整數序列,之間用空格分隔,序列結尾不能有多余空格。

輸入樣例:

6 2
1 2 3 4 5 6

輸出樣例:

5 6 1 2 3 4


自己想了一個偷雞的辦法,不在數組里實現循環移位,直接按照循環移位輸出,竟然拿了15分。。。。后來學了一個厲害的方法,大致思路就是,前半段逆序,后半段逆序,然后整個數組逆序。
上代碼
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    int N,M;
    cin>>N;
    cin>>M;
    int *p;
    p = new int[N];

    for(int i=0;i<N;i++)
    {
        cin>>p[i];
        //cout<<p[i];
    }
    M = M%N;
    reverse(p,p+N-M);
    reverse(p+N-M,p+N);
    reverse(p,p+N);
    for(int i=0;i<N;i++)
    {
        if (i == 0)
            cout << p[0];
        else
            cout << " " << p[i];
    }
    delete []p;
}



免責聲明!

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



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