问题如下:
这是我的尝试
#include <stdio.h>
#include <stdlib.h>
int function(int a[100], int n, int k)
{
int b[n], i;
if (k!=0 && n>1)
{
for (i=0; i<n; i++)
{
b[i]=a[i+1];
}
if (k<n || abs(k)<n)
{
if (k>0)
{
if (b[0]>0)
{
printf("%d", b[0]);
k=k-1;
}
}
if (k<0)
{
if (b[0]<0)
{
printf("%d", b[0]);
k=k+1;
}
}
return function(b, n-1, k);
}
}
else return 0;
}
int main()
{
int i, n, a[100], k;
printf("n = ");
scanf("%d", &n);
for (i=0; i<n; i++)
{
printf("a[%d] = ", i);
scanf("%d", &a[i]);
}
printf("k = ");
scanf("%d", &k);
printf("The new array is: \n");
function(a, n, k);
return 0;
}
但它只打印一个号码而且我不知道如何修复它。有谁知道我哪里出错了?
编辑:如果数组为{1,-1,2,-2,3,-3}且k = 2,则预期结果为{1,2}。如果k = -2,则预期结果为{-1,-2}
编辑2:b是一个数组,其中包含除[0]
以外的数组的所有元素答案 0 :(得分:0)
我发现您的代码存在三个问题。
1)当我复制你的代码(转换为C#,因为那是我的工作)时,它在这里为我抛出了一个ArgumentOutOfRangeException:
for (i=0; i<n; i++)
{
b[i]=a[i+1]; <------
}
当i
为99时,它会尝试将a[100]
复制到b[99]
,但没有a[100]
。您应该将for
循环改为:
for (i=0; i<n-1; i++)
2)你的代码基本上像对待队列一样处理a
并弹出第一个数字(通过将所有其他数字复制到一个新数组b
),而不是查看第一个数字到确定是否要打印它,您正在跳过它并查看您刚刚放入b
的第一个项目:
if (k>0)
{
if (b[0]>0) <------
{
printf("%d", b[0]); <-----
k=k-1;
}
}
您应该更改比较(和printf
行)以查看a[0]
而不是b[0]
。
3)每当k
大于n
时,您的整个逻辑块都会被跳过(例如,我错误地将k
设置为34而不是3,当我做的时候,if
块读取if (34 < 6 || abs(34) < 6)
,这总是错误的。