几周前我在考试中遇到了这个问题(未能回答),我想知道如何解决此类问题,因为我看到它们重复出现。
编写获取整数直到插入 -1 的 C 程序。如果先前写入的数字的某些乘积等于最后输入的整数 - 程序将打印它。
我知道这很难理解,但这里有几个例子:
(从左到右输入顺序)
1 -> 2 -> 3 -> 6 (将打印 2 * 3=6) -> 36 (将打印 2 * 3 * 6) -> -1
我可以看到由于内存限制,这个问题很难用数组解决...... 所以我想使用“列表”,但不知道如何使用。
我不想要一个完整的解决方案!我想得到有关如何用 C 解决它的任何提示(C# 也可以,但首选 C)。
答案 0 :(得分:0)
使用带有条件和计数排序的 do-while 循环。 https://en.wikipedia.org/wiki/Counting_sort
答案 1 :(得分:0)
我编写了一个原始程序,它可以执行您想要的操作,但它始终将 1
视为先前数字的乘积,对于已经输入的数字也是如此。我留给您解决问题的挑战。
#include <stdio.h>
#define SIZE 10
void combo( int pro, int sum );
int n[SIZE], found, i;
int main() {
for( ; i < SIZE && scanf("%d", &n[i]) == 1 && n[i] != -1; i++) {
found = 0;
combo(1,0);
if( found ) printf("%d ", n[i]);
}
return 0;
}
void combo( int pro, int sum )
{
if( pro == n[i] ) found = 1;
for(int j = 0; j < i - sum && !found; j++) {
combo(pro * n[j], sum + 1);
}
}
n, found, i
不必是全局变量,但由于 combo
可以多次调用自己,我认为避免给它太多参数是个好主意。我真的不知道这是否真的是个好主意。
无论如何,该程序是蛮力。 combo()
将尝试 n
元素的所有可能乘积。
对于每个 j
,combo
会调用自己生成一个新循环,对于这个新循环的每个索引,都会有另一个递归调用生成一个全新的循环,依此类推。
combo
在所有循环停止运行时停止调用自身。
当找到匹配的产品或 j
到达 i - sum
时,循环停止,其中 i
是存储在数组中的当前元素数减 1,而 sum
表示当前产品中涉及的元素数量。
每次在进入循环之前,该函数都会检查当前产品是否与数组中输入的最后一个数字匹配。
如果您知道数字是按升序输入的,则可以通过将 !found
与 pro < n[i]
交换来优化。
我还没有做过数学计算,但如果输入包含一系列随机整数,在调用 combo
中的 main
之前对数组进行排序可能更有效。