打印是否存在等于给定数字的数字组合

时间:2021-02-05 19:59:03

标签: c list algorithm

几周前我在考试中遇到了这个问题(未能回答),我想知道如何解决此类问题,因为我看到它们重复出现。

编写获取整数直到插入 -1 的 C 程序。如果先前写入的数字的某些乘积等于最后输入的整数 - 程序将打印它。

我知道这很难理解,但这里有几个例子:
(从左到右输入顺序)
1 -> 2 -> 3 -> 6 (将打印 2 * 3=6) -> 36 (将打印 2 * 3 * 6) -> -1

我可以看到由于内存限制,这个问题很难用数组解决...... 所以我想使用“列表”,但不知道如何使用。

我不想要一个完整的解决方案!我想得到有关如何用 C 解决它的任何提示(C# 也可以,但首选 C)。

2 个答案:

答案 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 元素的所有可能乘积。

对于每个 jcombo 会调用自己生成一个新循环,对于这个新循环的每个索引,都会有另一个递归调用生成一个全新的循环,依此类推。

>

combo 在所有循环停止运行时停止调用自身。
当找到匹配的产品或 j 到达 i - sum 时,循环停止,其中 i 是存储在数组中的当前元素数减 1,而 sum 表示当前产品中涉及的元素数量。

每次在进入循环之前,该函数都会检查当前产品是否与数组中输入的最后一个数字匹配。

如果您知道数字是按升序输入的,则可以通过将 !foundpro < n[i] 交换来优化。
我还没有做过数学计算,但如果输入包含一系列随机整数,在调​​用 combo 中的 main 之前对数组进行排序可能更有效。

相关问题