问题在于数组中的左旋转。
第一行包含两个以空格分隔的整数,表示n
(整数)和d
(必须执行的左旋转数)的相应值。
第二行包含n
以空格分隔的整数,用于描述数组初始状态的各个元素。
我的解决方案:
#include <stdio.h>
#include <malloc.h>
int main() {
int n, d, i;
scanf("%d %d", &n, &d);
int *a = (int *)malloc(sizeof(int) * n);
int *temp = (int *)malloc(sizeof(int) * d);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
for (i = 0; i < d; i++)
temp[i] = a[i];
for (i = 0; i < n - d; i++)
a[i] = a[i + d];
for (i = 0; i < n; i++)
a[i + n - d] = temp[i];
for (i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
答案 0 :(得分:0)
您的代码存在一些问题。
首先,您在代码中进行了隐式断言
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<d;i++)
temp[i]=a[i];
^
d should be <= n
错误:如果d > n
您正在分配区域中进行读取访问。
中的同样问题
for(i=0;i<n;i++)
a[i+n-d]=temp[i];
^ ^
2*n-d <= n and n <= d
n >= d for i = 0
malloc
调用之前的代码应该在条件
if (n > 0 && d > 0 && n < ... && d < ...)
我认为您可以假设d = n
编写算法的第一个版本。
答案 1 :(得分:0)
如果d > n
代码总是失败,但如果d < n
代码也失败:第四个for
循环不正确,它应该停在d
:
for (i = 0; i < d; i++)
a[i + n - d] = temp[i];