【问题标题】:Output a number with specified length and sum输出具有指定长度和总和的数字
【发布时间】:2019-09-25 08:56:32
【问题描述】:

我必须用 C 语言编写一个程序,它接受整数、sumOfDig 和 lengthOfNum。 sumOfDig 等于数字的总和,lengthOfNum 等于数字的长度。 我不允许使用数组或 math.lib

1 ≤ sumOfDig ≤ 81 和 1 ≤ lengthOfNum ≤ 9

我试图编写一个while循环,但我想不出一种方法可以构建一个数字并从数字之和中减去最后添加的数字。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int lengthOfNum;     /* stores the length of the number       */
    int sumOfDig;        /* stores the sum of the digits          */
    int ans;             /* stores the answer                     */

    scanf("%d", &sumOfDig);     /* scans the sum of the digits    */
    scanf("%d", &lengthOfNum);  /* scans the length of the number */

    ans=0;     /* initializes ans */

    /* adds a number to ans, and removes it from sumOfDig */
    while(sumOfDig!=0 && lengthOfNum!=0) {
        /*???*/

        lengthOfNum--;
    };

    printf("%d\n", ans);     /* prints the outcome */

    return 0;
}

以下应该是输入和输出:

输入:20 2 输出:不可能

In: 20 3 Out: 992(因为长度是3和9+9+2=20)

In: 50 8 Out: 99999500(因为长度是8和9+9+9+9+9+5+0+0=50)

【问题讨论】:

  • 什么意思,不允许使用数组?你能具体说明一下吗?
  • 我不允许在我的代码中以任何方式使用数组。例如:不允许将每个数字都存储在数组中。
  • 如果您想使用 scanf %d 解决方案,那么您可以使用基于 %10 和 /10 的循环。如果您不想坚持这一点,那么对字符串表示形式的流式解析器一次消耗一个字符可能会更简单。

标签: c sum digits


【解决方案1】:

我们称数字之和为 S 和指定长度 L。

首先,我们需要检查是否有解决方案。我们需要的最小位数取决于 9 被 S 整除的次数。

  1. 求 9 如何除以 S。我们称之为 Q。
  2. 找到上述除法的其余部分。我们称它为 R。
  3. 如果 R 为 0,
    1. 如果 L 小于 Q,
      1. 没有解决办法。
  4. 否则,
    1. 如果 L 小于 Q+1,
      1. 没有解决办法。

现在,我们可以生成输出了。

  1. 输出 Q 9s.
  2. 如果 R 不为 0,
    1. 输出 R.
    2. 输出 L-Q-1 0
  3. 其他
    1. 输出 L-Q 0

  1. 输出 Q 9s.
  2. 将 Z 设置为 L-Q。
  3. 如果 R 不为 0,
    1. 输出 R.
    2. 递减 Z。
  4. 输出 Z 0

还有其他方法。您可以通过在缓冲区中构建输出(甚至在 int 中)来避免首先检查输入,但我使用了一个易于可视化并遵循通常要求的在计算之前进行验证的约定。

除法可以作为一个循环来完成,这为您提供了我提到的替代方法的基础。

unsigned R = S;
unsigned Q = 0;
while (R > 9) {
   R -= 9;
   ++Q;
}

【讨论】:

  • 感谢清晰的解释!我现在明白了!
  • 我在回答中添加了一些内容。
【解决方案2】:

我在这里给出一个提示,而不是整个解决方案。

  • 了解对于给定的位数和长度之和,可能有许多正确答案。
  • 所使用的算法是始终输出 9,直到剩余数字的总和小于 9。

下面是一个算法。

  • 如果数字总和 > len *9 --> 输出不可能 --> 结束
  • 遍历数字。
    • 如果 sum_digits >= 9,--> 输出字符 9,--> 提示使用 printf ("9");
      • 将 sum_digits 减 9。
    • 其他输出字符(sum_digits)-->使用printf ("%c",sum_digits+'0');
      • 将 sum_digits 设置为 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 2020-10-07
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多