#include <stdio.h>
int main( )
{
int length = 0;
int divide = 0;
int count = 0;
int i;
printf("Set the length of array: \n");
scanf("%d", &length);
int array[length];
for(i = 0; i < length; i++)
{
scanf("%d", &array[i]);
}
printf("Divide array into subarray: \n");
scanf("%d", ÷);
for(i = 0; i < divide; i++)
{
int countfrom = length / divide * i;
int countto = countfrom + length / divide;
for(int j = countfrom; j < countto; j++)
{
if( array[j] == 1 && array[j+1] == 0 && array[j+2] == 1)
{
count++;
}
}
}
printf("count: %d\n", count);
return 0;
}
这是我到目前为止所拥有的。目的是从用户输入定义数组的长度并将其划分为子数组(int divide也来自用户输入)。
主要目的是计算在分开的子阵列中找到序列101的次数。它的效果很好,除了奇数值。例如,array[length(value: 17)] = {1, 0, 1, 2, 7, 9, 6, 5, 0, 1, 0, 1, 0, 1, 1, 0}
,如果除数值为5,那么子数组应该是,
{1, 0, 1}, {2, 7, 9}, {6, 5, 0}, {0, 1, 0}, {1, 0, 1}, {1, 0}
,计数值应为3.但是,它打印出四个。
答案 0 :(得分:-1)
我最初是误解了&#34; 101在分开的子阵列中找到了#34;因为子阵列实际上必须是101.如果你想搜索子阵列,确实需要j循环,但是你确实需要边界检查。
if( array[j] == 1 && array[j+1] == 0 && array[j+2] == 1)
应该是
if( j+2 < countto && array[j] == 1 && array[j+1] == 0 && array[j+2] == 1)
(或者您最初可以将countto减去2并将其调整到最多为2的长度。)
原始答案:
根据你的描述,你看起来根本不需要j循环或countto;在i循环中,你应该只是检查array[countfrom]==1 && array[countfrom+1]==0 && array[countfrom+2]==1
(并且首先检查从+ 2&lt;长度开始计数,这样你就不会超过数组的末尾)。
但是你的代码假设你有&#34;子阵列&#34;长度3;你应该在给定输入的情况下检查这是否真的是真的,如果不是,则给出错误消息。