我试图填写用户输入中缺少的数字(存储在数组中。例如,如果用户输入9,5,2,7,1。我的程序必须输出缺少的数字,这是3,4,6,8。
您可以看到缺少的数字加粗:1,2, 3 , 4 ,5, 6 ,7, 8
但是,我的代码似乎没有运行。 while循环不起作用。我觉得我的逻辑工作正常,但它没有输出任何东西。
void missing_num(int length, int numbers[]) { // length is the length of the array
// A function which finds the biggest number the user inputed
int big_num_answer = biggest_num(length, numbers);
// A functon which finds the smallest number the user inputed
int small_num_answer = smallest_num(length, numbers);
int has_been_used = 0;
int i = 0;
int start_num = small_num_answer;
while(start_num <= big_num_answer) {
if(numbers[i] == start_num + 1) {
start_num += 1;
has_been_used = 1;
} else if(i >= length && has_been_used == 0) {
printf("%d", start_num + 1);
}
i++;
if (i > length) {
i = 0;
}
}
}
答案 0 :(得分:1)
当你遇到逻辑问题时,最好逐行检查,看看会发生什么。我不太明白你在循环中想要做什么,所以让我们逐块浏览并假装我们使用1,2,5,7,9作为输入。
while(start_num <= big_num_answer) {
非常简单。 while循环继续运行,而start_num低于或等于最大数字。在这种情况下,start_num是1.
if(numbers[i] == start_num + 1) {
start_num += 1;
has_been_used = 1;
}
我是0,所以这一行证明了if(1 == 2)。它被跳过了。
else if(i >= length && has_been_used == 0)
{
printf("%d", start_num + 1);
}
这证明了if(0> = 5 AND 0 = 0)。它被跳过,没有输出数字。
i++;
if (i > length) {
i = 0;
}
我现在是1.让我们再次进行循环。
if(numbers[i] == start_num + 1) {
start_num += 1;
has_been_used = 1;
}
判断if(2 == 2)。所以现在start_num = 2,并且has_been_used = 1。
else if(i >= length && has_been_used == 0)
{
printf("%d", start_num + 1);
}
完全跳过else块,因为其他条件被击中。并且这个块永远不会被再次命中,因为has_been_used已设置为1并且您没有将has_been_used设置为0的代码。因为我们现在已经完成了它,所以我们可以看到代码不输出任何内容的至少一个原因。
答案 1 :(得分:0)
你做了很多我不理解的事情。无论如何,这是一个快速尝试:
static void print_with_missing(const int *array, size_t length)
{
int last = *array;
printf("%d", last);
for (size_t i = 1; i < length;)
{
while (array[i] != last + 1)
{
printf(" %d", ++last);
}
printf(" %d", array[i]);
last = array[i++];
}
}
如果使用样本数组({ 1, 2, 5, 7, 9 }
)调用,则输出为:
1 2 3 4 5 6 7 8 9
注意:它需要对输入进行排序,这似乎是有意义的。如果你不想暴露它,那么当然首先在函数内部调用qsort()
。
答案 2 :(得分:0)
这是另一个不太复杂的想法,不需要排序输入,但提供有序输出:
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
int numbers[1024];
int max = INT_MIN;
int min = INT_MAX;
size_t n;
int main(void) {
while (n < 1024)
{
// use something better then scanf for "production quality" code
if (scanf("%d", numbers + n++) != 1) break;
if (numbers[n-1] > max) max = numbers[n-1];
if (numbers[n-1] < min) min = numbers[n-1];
}
if (max > min && max - min)
{
size_t rangesize = max - min - 1;
// use an array of "markers" for the numbers present in the input
char *used = calloc(1, rangesize);
if (!used) return 1;
// set the markers
for (size_t i = 0; i < n; ++i)
{
if (numbers[i] > min && numbers[i] < max)
{
used[numbers[i]-min-1] = 1;
}
}
// and use them for output
for (size_t i = 0; i < rangesize; ++i)
{
if (!used[i])
{
printf("%d ", (int)i + min + 1);
}
}
puts("");
free(used);
}
}
答案 3 :(得分:0)
让我们解读这个:
int start_num = small_num_answer;
while(start_num <= big_num_answer) {
你想从最小到最大的数字循环到目前为止都很好。
if(numbers[i] == start_num + 1) {
麻烦从这里开始我不是很确定但是我想你要检查一下,下一个数字是否也在数组中,但你只检查numbers[i]
而不是numbers
的所有元素。
start_num += 1;
has_been_used = 1;
如果当前数字在那里,则增加整数以搜索一个。并设置它在数组中的标志。但你永远不会重置这个值。所以这总是1。
} else if(i >= length && has_been_used == 0) {
printf("%d", start_num + 1);
}
在这里检查数组是否仍在边界内(由于你之前使用numbers[i]
没有检查,所以检查是否为迟到。并检查(不工作)标志,数字是否在输入中。
i++;
if (i > length) {
i = 0;
}
}
最后,检查i
是否大于length
,这是一个好主意,但i = length
已经超出界限,因为我们开始计算0
我尝试按照你的方法精神给你一些东西,但你需要第二个循环来遍历整个数组i
。
while(start_num < big_num_answer) {
for(i = 0; i < length; i++){ //iterate though the whole array
if(numbers[i] == start_num + 1) {
has_been_used = 1;
}
}
if (has_been_used == 0){
printf("%d", start_num + 1); //print if not found
}
has_been_used = 0; // reset flag
start_num++; // next elelemt
}