#include<stdio.h>
int main(void)
{
//1.读取N和M
int N, M;
scanf_s("%d", &N);
scanf_s("%d", &M);
int move = M;
//2.把数据读进数组并复制
int cnt;
int number[1000] = { 0 };
for (cnt = 1; cnt <= N; cnt++)
{
scanf_s("%d", &number[cnt]);
}
for (cnt = N + 1; cnt <= N * 2; cnt++)
{
number[cnt] = number[cnt - N];
}
/*for (cnt = 1; cnt <= N * 2; cnt++)
printf("%d ", number[cnt]);*/
//3.计算移动位置并开始移动
for (cnt = N + 1; cnt <= N * 2; cnt++)
{
int n = cnt - N;
int distance = N - n;
move = M;
if (M <= distance)
{
number[n + M] = number[cnt];
}
else
{
move -= distance;
move %= N;
number[move] = number[cnt];
}
}
printf("%d", number[1]);
for (cnt = 2; cnt <= N; cnt++)
{
printf(" %d", number[cnt]);
}
return 0;
}
该方法没能拿完分
一直有测试点显示答案错误
可能是对题目理解有错误
#include<stdio.h>
int main(void)
{
//1.读取N和M
int N, M;
scanf_s("%d", &N);
scanf_s("%d", &M);
int move = M;
//2.把数据读进数组并复制
int cnt;
int number[1000] = { 0 };
for (cnt = 1; cnt <= N; cnt++)
{
scanf_s("%d", &number[cnt]);
}
for (cnt = N + 1; cnt <= N * 2; cnt++)
{
number[cnt] = number[cnt - N];
}
/*for (cnt = 1; cnt <= N * 2; cnt++)
printf("%d ", number[cnt]);*/
//3.计算移动位置并开始移动
for (cnt = N + 1; cnt <= N * 2; cnt++)
{
int n = cnt - N;
int distance = N - n;
move = M;
if (M <= distance)
{
number[n + M] = number[cnt];
}
else
{
move %= N;
if (move <= distance)
{
number[n + move] = number[cnt];
}
else
{
move -= distance;
number[move] = number[cnt];
}
}
}
printf("%d", number[1]);
for (cnt = 2; cnt <= N; cnt++)
{
printf(" %d", number[cnt]);
}
return 0;
}
10.11修改
参考了csdn上的资料后 得知一直通不过的测试点1是要移动的位数大于数组本身的大小
于是修改了一下此处的移动:
即先将要移动的M取余N 然后判断剩下的数和distance的大小关系
做一个判断后再次进行移动
结果突然就对了
思路:
1.读取N和M
比较简单
2.将数据读取进数组并进行一次复制
这个也比较简单
复制一次代码是为了保留原数据以便后续进行移动
3.计算移动位置并开始移动
跟数学比较有关