用单下标数组解决如下问题:读入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 ] );
}
最佳答案
不幸的是,您的教授可能不够聪明,无法解决他自己的问题。这个问题的最小可能数组大小为 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;
}
如果您能够正确解释它的工作原理,欢迎您在作业中使用此代码(我希望您的教授教您如何编写注释)。
关于c++ - 在数组和循环方面需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6728451/