1007沒什么好說的,就是注意暴力求素數的時候,循環到(根號n)+1就好;
重點說說1008,不用新開一個數組就實現循環移位的操作
一個數組A中存有N(>0)個整數,在不允許使用另外數組的前提下,將每個整數循環向右移M(≥0)個位置,即將A中的數據由(A0A1⋯AN−1)變換為(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M個數循環移至最前面的M個位置)。如果需要考慮程序移動數據的次數盡量少,要如何設計移動的方法?
輸入格式:
每個輸入包含一個測試用例,第1行輸入N(1≤N≤100)和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;
}