如何获得数组的算术压缩(C)
所以我的要求是如何获得数组的算术压缩(C),c,arrays,pointers,C,Arrays,Pointers,所以我的要求是 需要:n>=1。元素a[0]。。。存在[n-1] 许诺 如果n==1,则返回值为1 如果n>1,如果[0]。。。[n-1]表格 算术序列 许诺 否则,返回值为0 到目前为止,我的职能是 int is_arith_seq(const int *a, int n) { assert(n >= 1); if (n == 1) return 1; int i; int initaldif = a[1]-a[0]; int
- 需要:n>=1。元素a[0]。。。存在[n-1]李>
- 许诺
- 如果n==1,则返回值为1
- 如果n>1,如果[0]。。。[n-1]表格 算术序列
- 许诺 否则,返回值为0
int is_arith_seq(const int *a, int n)
{
assert(n >= 1);
if (n == 1)
return 1;
int i;
int initaldif = a[1]-a[0];
int currentdif,result;
for (i=0;i<n;i++)
{
currentdif = a[i+1]-a[i];
if(initaldif!=currentdif)
return 0;
}
return 1;
}
int是数组(常量int*a,int n)
{
断言(n>=1);
如果(n==1)
返回1;
int i;
int initaldif=a[1]-a[0];
int currentdif,结果;
for(i=0;i如果数组有n个元素,则for循环将导致分段错误。它会一直运行到n-1
,但您正在访问a[i+1]
,a[n]
是不允许的。修改如下:
for (i = 0; i < n - 1; i++)
{
currentdif = a[i+1]-a[i];
if (initaldif != currentdif)
return 0;
}
(i=0;i
{
电流dif=a[i+1]-a[i];
if(initaldif!=currentdif)
返回0;
}
问题就在这里currentdif=a[i+1]-a[i];
您认为在第n-1次迭代期间,此代码会发生什么变化?
i=n-1+1=n
因此,如果n=1,函数要么返回1,要么由于错误而返回0!offbyone错误是最常见的编程错误之一。快速跟踪其中许多错误的一个好方法是查看循环的第一次和最后一次迭代 您的目的是循环计算差异
a[1]-a[0] a[2]-a[1] ... a[n-1]-a[n-2]
第一次迭代具有
i=0
并计算a[1]-a[0]
,最后一次迭代具有i=n-1
并计算a[n]-a[n-1]
。哎呀,错了!需要调整循环。您的算术序列测试应该像您所做的那样设置initialdif
,但然后预测序列中的下一个元素。如果任何一项失败,则数字串不是算术序列:
int initaldif=a[1]-a[0];
对于(i=2;i
什么是“不起作用”。代码与它必须做的事情有什么不同?同样,这不是你必须递归求解的赋值。for(i=0;ifor(i=0;i perfect not!请阅读注释。你需要提前了解的是,许多形式的“未定义行为”中有一种是“诱使作者认为他们编写了正确的代码,然后在最不经意的时候开始失败”。事实上,这种形式的未定义行为出人意料地经常发生。
int initaldif = a[1]-a[0];
for (i = 2; i < n; i++)
if (a[i] != a[i-1] + initaldif)
return 0;
return 1;