java - 字符的拆分和总和
问题描述
我必须编写一个函数来找到其数字总和为 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++;
}
}
解决方案
你的标题和描述有点不一致,所以我可能误解了这个问题,但无论如何工作都很有趣。
但是我认为您要求一种算法来产生最小的值,其基数为 10 的数字加起来为 N。(可能更适合数学交换的问题。)
一个假设:
N > 0
提出以下几点意见:
- 任何一个以 10 为基数的数字的最大值是 9。
- 用 w 位可以得到的最大 N 是
Math.pow(10,w) - 1
。(例如,如果 w 是 2 位数字,则最大数字是 (10**2)-1 或 99。 - 要添加到 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
。在这种情况下,要小于r
的最高有效位,m
必须小于 的最高有效位r
。由于剩余的数字(如果有)r
是 9,“m”没有可能的剩余数字,这可能相当于一个数字来弥补最高有效数字的差异,因此m
不能是相同的数字并且具有最多有效数字小于r
。
如果m
具有相同的位数但最高有效位大于r
则根据定义是一个更大的数字。
如果m
有更多的数字,r
那么根据定义是一个更大的数字。
推荐阅读
- c# - 如何将 onGUI 方法固定到面板
- javascript - 如何在 js 函数中使用我用 php 创建的数组
- html - 为什么 Chrome 会隐藏部分下拉菜单输入?
- javascript - 在 node.js 上遍历文件路径的深度优先搜索 (DFS)
- flutter - 在 statefullWidget flutter-web 中调用内部类时出错
- python - 如何使用 Google Docs API v1 和 Python 将内联图像居中
- java - 数量增加2,而不是1。弹簧靴
- git - 在 Git 中更改文件扩展名的大小写
- r - 使用 plotly 更改条形图中的颜色
- apache-spark - 为什么 Spark shell(PySpark 或 Scala)在客户端模式而不是集群模式下运行?