【问题标题】:Print if there is a number combination that equals the given number [closed]如果存在等于给定数字的数字组合,则打印[关闭]
【发布时间】:2021-05-10 04:21:20
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 如果我在输入36之后再输入18,程序是打印3 * 6 = 18,还是什么都不打印?
  • 是的,它打印 3 * 6 ,如果有一个,它将每次打印 1 个组合,如果没有,它将不打印任何内容。它会一直这样做,直到输入 -1(当然假设输入的数字是正数)
  • List<T> 只是对数组的精美包装,因此无论您指的是什么“内存限制”都无法通过使用列表来解决。
  • 您将如何“手动”执行此操作?你可以在代码中应用它吗?甚至是蛮力版本?从那里开始。
  • 提示:您可以使用模运算符通过将结果与0 进行比较来确定一个数是否可​​以被另一个数整除。例如,6 % 2 == 036 % 3 == 0

标签: c list algorithm


【解决方案1】:

使用带条件的 do-while 循环和计数排序。 https://en.wikipedia.org/wiki/Counting_sort

【讨论】:

    【解决方案2】:

    我编写了一个原始程序,它可以执行您想要的操作,但它始终将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 &lt; n[i] 交换来进行优化。
    我还没有计算过,但如果输入包含一系列随机整数,在调​​用combo in main 之前对数组进行排序可能更有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2013-02-13
      相关资源
      最近更新 更多