#include <stdio.h> #define MAXN 10 void ArrayShift( int a[], int n, int m ); int main() { int a[MAXN], n, m; int i; scanf("%d %d", &n, &m); for ( i = 0; i < n; i++ ) scanf("%d", &a[i]); ArrayShift(a, n, m); for ( i = 0; i < n; i++ ) { if (i != 0) printf(" "); printf("%d", a[i]); } printf("\n"); return 0; } /* 你的代码将被嵌在这里 */void ArrayShift(int a[], int n, int m) { int i; int b[n]; for(i=0;i<n;i++) b[i]=a[i]; for(i=m;i<n;i++) a[i]=b[i-m]; for(i=0;i<m;i++) a[i]=b[n-m+i]; }本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(an−m⋯an−1a0a1⋯an−m−1)(最后m个数循环移至最前面的m个位置)。
时间: 2024-03-23 12:38:53 浏览: 23
这段代码实现了一个对数组进行循环右移的函数ArrayShift,其具体实现原理如下:
1. 首先创建一个和原数组大小相同的临时数组b,用于存储原数组a中的所有元素。
2. 然后将数组a中的后m个元素(即a[n-m]到a[n-1])存放到数组a的前m个位置(即a[0]到a[m-1])中。
3. 最后将数组a中的前n-m个元素(即a[0]到a[n-m-1])存放到数组a中的第m个位置到第n-1个位置(即a[m]到a[n-1])中。
具体实现代码如下:
```
void ArrayShift(int a[], int n, int m) {
int i;
int b[n];
for(i=0;i<n;i++)
b[i]=a[i];
for(i=m;i<n;i++)
a[i]=b[i-m];
for(i=0;i<m;i++)
a[i]=b[n-m+i];
}
```
相关问题
#include <stdio.h> #include <string.h> #include <stdlib.h> #define maxn 1000 char buf[maxn], str[maxn], signStack[maxn], ch[2]; int len, id, idSign, idAns, i, n; double ans[maxn]; void checkSign(char sign){ if(sign == '(') signStack[idSign++] =
sign;
else if(sign == ')'){
while(signStack[idSign-1] != '('){
char op = signStack[--idSign];
double b = ans[--idAns], a = ans[--idAns];
if(op == '+') ans[idAns++] = a + b;
else if(op == '-') ans[idAns++] = a - b;
else if(op == '*') ans[idAns++] = a * b;
else if(op == '/') ans[idAns++] = a / b;
}
idSign--;
}
else if(sign == '+' || sign == '-'){
while(idSign > 0 && signStack[idSign-1] != '('){
char op = signStack[--idSign];
double b = ans[--idAns], a = ans[--idAns];
if(op == '+') ans[idAns++] = a + b;
else if(op == '-') ans[idAns++] = a - b;
else if(op == '*') ans[idAns++] = a * b;
else if(op == '/') ans[idAns++] = a / b;
}
signStack[idSign++] = sign;
}
else if(sign == '*' || sign == '/'){
while(idSign > 0 && (signStack[idSign-1] == '*' || signStack[idSign-1] == '/')){
char op = signStack[--idSign];
double b = ans[--idAns], a = ans[--idAns];
if(op == '*') ans[idAns++] = a * b;
else if(op == '/') ans[idAns++] = a / b;
}
signStack[idSign++] = sign;
}
}
int main(){
while(fgets(buf, maxn, stdin) != NULL){
len = strlen(buf);
id = idSign = idAns = 0;
memset(ans, 0, sizeof(ans));
memset(signStack, 0, sizeof(signStack));
for(i = 0; i < len; i++){
if(buf[i] == ' ' || buf[i] == '\n') continue;
if(buf[i] >= '0' && buf[i] <= '9'){
n = 0;
while(buf[i] >= '0' && buf[i] <= '9'){
n = n * 10 + buf[i] - '0';
i++;
}
ans[idAns++] = (double)n;
i--;
}
else{
checkSign(buf[i]);
}
}
while(idSign > 0){
char op = signStack[--idSign];
double b = ans[--idAns], a = ans[--idAns];
if(op == '+') ans[idAns++] = a + b;
else if(op == '-') ans[idAns++] = a - b;
else if(op == '*') ans[idAns++] = a * b;
else if(op == '/') ans[idAns++] = a / b;
}
printf("%.2f\n", ans[0]);
}
return 0;
}
请问这段代码实现了什么功能?
第1关:非递归实现皇后问题#include <stdio.h> /********** Begin **********/ void main() { } /********** End **********/
皇后问题是指在一个n×n的棋盘上放置n个皇后,使得皇后之间互相不能攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。下面是一个非递归实现皇后问题的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100
int n, ans, cur;
int col[MAXN], d1[MAXN * 2], d2[MAXN * 2];
struct Node {
int row, col;
} stack[MAXN];
void push(int row, int col) {
stack[cur].row = row;
stack[cur].col = col;
cur++;
col[row] = d1[row + col] = d2[row - col + n] = 1;
}
void pop() {
cur--;
int row = stack[cur].row;
int col = stack[cur].col;
col[row] = d1[row + col] = d2[row - col + n] = 0;
}
void dfs() {
while (cur > 0 || stack[0].row < n) {
if (stack[cur - 1].row == n - 1) {
ans++;
pop();
} else {
int row = stack[cur - 1].row + 1;
int col = 0;
while (col < n && (col[row] || d1[row + col] || d2[row - col + n])) {
col++;
}
if (col < n) {
push(row, col);
} else {
pop();
}
}
}
}
int main() {
scanf("%d", &n);
dfs();
printf("%d\n", ans);
return 0;
}
```