使用单下标数组解决以下问题:读入20个数字,每个数字介于10和100之间(包括10和100)。读取每个数字时,仅在它与已读取的数字不重复时才打印。提供所有20个数字不同的“最坏情况”。使用尽可能小的数组来解决这个问题。
这是我到目前为止所做的:
#include <stdio.h>
#define SIZE 20
int duplicate (int num[] );
int main ()
{
int i, numbers[ SIZE ];
printf( " Enter 20 numbers between 10 and 100:\n " );
scanf_s( "%d\n" );
for (int i = 0; i < SIZE - 1; i++ );
{
int duplicate( int num[] )
{
int i, hold;
for ( i = 0; i <= SIZE - 1; i++ )
if ( num[i] == num[i=1] ){
hold = num[i];
else
hold = num[i+1];
}
printf( "%3d\n," num[ i ] );
}
答案 0 :(得分:4)
不幸的是,你的教授可能不够聪明,无法解决自己的问题。这个问题的最小可能数组是2号(假设一个64位数据类型,这是标准规定的最大数据。对于32位整数,它需要三个元素,并且有128位整数,只有1)。
#include <stdint.h>
#include <stdio.h>
int main(void)
{
int_fast64_t visited[2] = { 0 };
int inputs_left = 20;
do {
int input, slot;
int_fast64_t mask;
puts("Enter an integer between 10 and 100: ");
if (!scanf("%d", &input)) {
puts("That's not a number!\n");
continue;
}
if (input < 10 || input > 100) {
puts("Out of range!\n");
continue;
}
slot = (input - 10) >> 6;
mask = 1 << ((input - 10) & 0x3F);
if (visited[slot] & mask) {
puts("Already seen, it is a duplicate.\n");
}
else {
visited[slot] |= mask;
printf("%d is new\n", input);
}
inputs_left--;
} while (inputs_left);
return 0;
}
如果您能正确解释它的工作原理,欢迎您在作业中使用此代码(我希望您的教授教您如何撰写评论)。
答案 1 :(得分:2)
这是我想出来的,感谢大家的帮助:
#include <stdio.h>
#define MAX 20
int main()
{
int a[ MAX ] = { 0 }; /* user input */
int i; /* counter */
int j; /* counter */
int k = 0; /* number of integers entered */
int duplicate; /* notify of duplicates */
int value;
printf( "Enter 20 numbers between 10 - 100;\n" );
/* ask user for 20 numbers */
for ( i = 0; i <= MAX - 1; i++ ){
duplicate = 0;
scanf( "%d", &value);
/* decide if integer is duplicate */
for ( j = 0; j < k; j++ ) {
/* notify and stop loop if duplicate */
if ( value == a[ j ] ) {
duplicate = 1;
break;
{ /* end if */
/* enter number into array if it's not a duplicate */
if ( !duplicate )
a[ k++ ] = value;
} /* end if */
答案 2 :(得分:1)
您的代码存在一些问题:
你的if语句应该为每个if / else使用大括号({}),或者根本不使用。
if (test) {
// code
}
else {
// code
}
或
if (test)
// code
else
// code
至于逻辑:
PS:请尝试正确缩进代码。如果没有正确缩进,许多人甚至都不会尝试提供帮助。
答案 3 :(得分:0)
我的C非常生疏,所以这是一个伪代码解决方案(因为这个是功课,你应该为自己做一些):
print initial prompt;
declare nums[ array size 20 ]; // I later assume a 0-based index
declare boolean found;
for (i=0; i < 20; i++) {
// prompt for next number if desired
read next number into nums[i];
found = false;
// compare against all previously read numbers
for (j=0; j < i; j++) {
if (nums[j] == nums[i]) {
found = true;
break;
}
}
if (!found) {
print nums[i];
}
}
注意:所述问题并未说明数字必须是整数。此外,它说“使用尽可能小的数组” - 如果你为当前数字引入一个非数组变量,你可以使用19个元素数组(因为第20个数字只需要检查前19个,而不是反对自己),但这会使代码更复杂。
另请参阅我上面发布的评论,其中提到了代码中的一些特定问题。并检查所有括号是否匹配。