【问题标题】:Spliting and sum of chars字符的拆分和总和
【发布时间】:2020-01-26 01:24:52
【问题描述】:

我必须编写一个函数来找到其数字总和为 N 的最小数字。我无法以更好的方式计算出它的蛮力,但在添加整数时它没有正确添加数组,它总结了一个非常奇怪的模式。

public int sumN(int N) {
        int total = 10;
        char[] n;
        ArrayList<Integer> nrs = new ArrayList<Integer>();
        int sum = 0;
        String x = "";
        if(N<=9)
            return N;
        else
        {
            while(true)
            {   
                x = Integer.toString(total);
                n = x.toCharArray();
                for(char c : n)
                {
                    nrs.add(Character.getNumericValue(c));
                }
                for(Integer i : nrs)
                {
                    sum = sum + i;
                }
                if(sum == N)
                {
                    return total;
                }
                total++;
            }
        }

【问题讨论】:

  • “我想不出比蛮力更好的方法,但即便如此,我的数学似乎有点不对劲。”但是你的问题具体是什么?
  • 抱歉,我用更多信息编辑了这个问题。

标签: java algorithm char integer


【解决方案1】:

你的标题和描述有点不一致,所以我可能误解了这个问题,但无论如何工作都很有趣。

但我认为您要求一种算法来产生以 10 为基数的数字加起来为 N 的最小值。(这个问题可能更适合数学交换。)

一个假设:

N > 0

有几点观察:

  1. 任何一个以 10 为底的数字的最大值是 9。
  2. w 位可以得到的最大 N 是Math.pow(10,w) - 1。 (例如,如果 w 是 2 位数字,则最大数字是 (10**2)-1 或 99。
  3. 要添加到 N 的数字的最小位数 x 必须是 ceil(N/9)。 (例如,对于 N=20,该值必须至少包含 3 位数字,因为 2 位数字之和的最大值为 18=9+9。)

因此问题被简化为最小化最重要的数字,因为这将代表可能的最低数字,而与较小的数字无关。

所以要最小化最重要的数字,应该最大化剩余的数字,即 (x-1) 9。

所以假设 x 被计算为最小位数:

x = ceil(N/9)               // e.g. N=82, x=10

那么最低有效数字是一系列 (x-1) 个 9:

y = pow(10,(x-1))-1         // 999999999

所以最小化最重要的数字变成了

z = ((N - (9 * (x-1))) * pow(10,(x-1))   // 1000000000

然后结果是

r = (z + y)                // 1999999999

那么如何证明它是数字之和为 N 的最小可能数呢?

请注意,数字会很快变大,因此如果您需要处理 N 的任何值,则需要使用处理任意精度的BigInteger


这是一个证明的尝试:

假设存在一个m,其值小于r(上图):

m < r

假设 m 的位数比 r 少,根据定义,这将满足条件。

但是如果

SUM(digits of m) == SUM(digits of r) == N

并且 r 对于 m 的每个数字都有一个“9”(除了最高有效数字外都是 9)并且 r 有一个额外的数字,没有 m 可以是更少的数字并满足上述条件。

假设m 具有相同的位数并且小于r。在这种情况下要小于rm 的最高有效数字必须小于r 的最高有效数字。由于 r 的剩余数字(如果有)是 9,因此“m”没有可能的剩余数字,这可能相当于一个数字来弥补最高有效数字的差异,因此 m 不能是相同的数字位数且最高有效位小于r

如果m 具有相同的位数,但最高有效位大于r,则根据定义是一个更大的数字。

如果m 的位数比r 多,那么根据定义是一个更大的数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多