在对 2 个或更多整数执行加法时获取所有进位数字的总和
Get the sum of all carried digits while performing addition on 2 or more integers
我接到了这个任务,老实说我不明白具体要做什么。
是因为我的英语水平,或者数学水平,但这真的是我无法理解的事情。你能帮助至少理解任务吗?
我的php见识很好,至少我是这么认为的...
任务是这样的:
“进位”是初等算术的一个术语。这是您在添加数字时转移到具有更高有效数字的列的数字。
这个任务是关于获取所有进位数字的总和。
您将收到一个包含两个数字的数组,如示例中所示。该函数应该return所有进位数字的总和。
function carry($arr) {
// ...
}
carry([123, 456]); // 0
carry([555, 555]); // 3 (carry 1 from ones column, carry 1 from tens column, carry 1 from hundreds column)
carry([123, 594]); // 1 (carry 1 from tens column)
支持任意数量的操作数者优先:
carry([123, 123, 804]); // 2 (carry 1 from ones column, carry 1, carry 1 from hundreds column)
由于是家庭作业,我不会完全回答这个问题,但解释一下你似乎感到困惑的部分,以便你可以将它们放在一起。
1 11 111 111 <- these are the carry digits
555 555 555 555 555
+ 555 -> + 555 -> + 555 -> + 555 -> + 555
----- ----- ----- ----- -----
0 10 110 1110
为了更好的两位数示例,我们使用 6+6
。要获得进位数字,您可以使用 modulus operator where 12 % 10 == 2
。所以,(12 - (12 % 10)) / 10 == 1
.
再次感谢。 @萨米奇
我得到它来让它工作。实际上问题是我的英语数学水平。 “进位数字”一词对我来说毫无意义。我完全专注于其他事情。
这是我的代码:它可能远非完美,但它完成了工作:)
function carry($arr) {
$sum_ones = 0;
$sum_tens = 0;
$sum_hunds = 0;
$arrCount = count($arr);
foreach($arr as $key){
$stri = (string)$key;
$foo[] = array(
"hunds" => $stri[0],
"tens" => $stri[1],
"ones" => $stri[2]
);
}
$fooCount = count($foo);
for($i=0; $i<$fooCount; $i++) {
$sum_ones+= $foo[$i]["ones"];
$sum_tens+= $foo[$i]["tens"];
$sum_hunds+= $foo[$i]["hunds"];
}
$sum1 = ($sum_ones - ($sum_ones % 10)) / 10;
$sum10 = ($sum_tens - ($sum_tens % 10)) / 10;
$sum100 = ($sum_hunds - ($sum_hunds % 10)) / 10;
return ($sum1 + $sum10 + $sum100);
}
$arr = array(555, 515, 111);
echo carry($arr);
关于“携带”的背景信息:https://en.m.wikipedia.org/wiki/Carry_(arithmetic)
对于这个任务,我们实际上不需要写在等号线下的数字,只需要携带的数字。重要的是,计算后续列时需要使用进位数。
在循环每一列整数之前,反转列的顺序,以便从左到右循环也迭代最低单位列并前进到更高单位列(个,然后是十,然后是百,等等) .
为了灵活性,我的代码片段旨在处理动态长度的数字。如果处理潜在的浮点数,您只需将所有数字乘以 10 的幂即可将所有值转换为整数。我的代码片段不是为处理有符号整数而设计的。
代码:(Demo)
function sumCarries(array $array) {
$columns = ['carries' => []];
// prepare matrix of 1-digit integers in columns -- ones, tens, hundreds, etc
foreach ($array as $integer) {
$columns[] = str_split(strrev($integer));
}
// sum column values in ascending order and populate carry values
// subsequent column sums need to include carried value
for ($i = 0, $len = strlen(max($array)); $i < $len; ++$i) {
$columns['carries'][$i + 1] = (int)(array_sum(array_column($columns, $i)) / 10);
}
// sum all populated carry values
return array_sum($columns['carries']);
}
$tests = [
[123, 456], // no carries in any column
[555, 555], // 1 ones, 1 tens, 1 hundreds
[123, 594], // 1 tens
[123, 123, 804], // 1 ones, 1 hundreds
[99, 9, 99, 99, 99], // 4 ones, 4 hundreds
[9,9,9,9,9,9,9,9,9,9,9,9], // 10 ones
];
var_export(array_map('sumCarries', $tests));
输出:
array (
0 => 0,
1 => 3,
2 => 1,
3 => 2,
4 => 8,
5 => 10,
)
我接到了这个任务,老实说我不明白具体要做什么。 是因为我的英语水平,或者数学水平,但这真的是我无法理解的事情。你能帮助至少理解任务吗? 我的php见识很好,至少我是这么认为的...
任务是这样的:
“进位”是初等算术的一个术语。这是您在添加数字时转移到具有更高有效数字的列的数字。
这个任务是关于获取所有进位数字的总和。
您将收到一个包含两个数字的数组,如示例中所示。该函数应该return所有进位数字的总和。
function carry($arr) {
// ...
}
carry([123, 456]); // 0
carry([555, 555]); // 3 (carry 1 from ones column, carry 1 from tens column, carry 1 from hundreds column)
carry([123, 594]); // 1 (carry 1 from tens column)
支持任意数量的操作数者优先:
carry([123, 123, 804]); // 2 (carry 1 from ones column, carry 1, carry 1 from hundreds column)
由于是家庭作业,我不会完全回答这个问题,但解释一下你似乎感到困惑的部分,以便你可以将它们放在一起。
1 11 111 111 <- these are the carry digits
555 555 555 555 555
+ 555 -> + 555 -> + 555 -> + 555 -> + 555
----- ----- ----- ----- -----
0 10 110 1110
为了更好的两位数示例,我们使用 6+6
。要获得进位数字,您可以使用 modulus operator where 12 % 10 == 2
。所以,(12 - (12 % 10)) / 10 == 1
.
再次感谢。 @萨米奇
我得到它来让它工作。实际上问题是我的英语数学水平。 “进位数字”一词对我来说毫无意义。我完全专注于其他事情。
这是我的代码:它可能远非完美,但它完成了工作:)
function carry($arr) {
$sum_ones = 0;
$sum_tens = 0;
$sum_hunds = 0;
$arrCount = count($arr);
foreach($arr as $key){
$stri = (string)$key;
$foo[] = array(
"hunds" => $stri[0],
"tens" => $stri[1],
"ones" => $stri[2]
);
}
$fooCount = count($foo);
for($i=0; $i<$fooCount; $i++) {
$sum_ones+= $foo[$i]["ones"];
$sum_tens+= $foo[$i]["tens"];
$sum_hunds+= $foo[$i]["hunds"];
}
$sum1 = ($sum_ones - ($sum_ones % 10)) / 10;
$sum10 = ($sum_tens - ($sum_tens % 10)) / 10;
$sum100 = ($sum_hunds - ($sum_hunds % 10)) / 10;
return ($sum1 + $sum10 + $sum100);
}
$arr = array(555, 515, 111);
echo carry($arr);
关于“携带”的背景信息:https://en.m.wikipedia.org/wiki/Carry_(arithmetic)
对于这个任务,我们实际上不需要写在等号线下的数字,只需要携带的数字。重要的是,计算后续列时需要使用进位数。
在循环每一列整数之前,反转列的顺序,以便从左到右循环也迭代最低单位列并前进到更高单位列(个,然后是十,然后是百,等等) .
为了灵活性,我的代码片段旨在处理动态长度的数字。如果处理潜在的浮点数,您只需将所有数字乘以 10 的幂即可将所有值转换为整数。我的代码片段不是为处理有符号整数而设计的。
代码:(Demo)
function sumCarries(array $array) {
$columns = ['carries' => []];
// prepare matrix of 1-digit integers in columns -- ones, tens, hundreds, etc
foreach ($array as $integer) {
$columns[] = str_split(strrev($integer));
}
// sum column values in ascending order and populate carry values
// subsequent column sums need to include carried value
for ($i = 0, $len = strlen(max($array)); $i < $len; ++$i) {
$columns['carries'][$i + 1] = (int)(array_sum(array_column($columns, $i)) / 10);
}
// sum all populated carry values
return array_sum($columns['carries']);
}
$tests = [
[123, 456], // no carries in any column
[555, 555], // 1 ones, 1 tens, 1 hundreds
[123, 594], // 1 tens
[123, 123, 804], // 1 ones, 1 hundreds
[99, 9, 99, 99, 99], // 4 ones, 4 hundreds
[9,9,9,9,9,9,9,9,9,9,9,9], // 10 ones
];
var_export(array_map('sumCarries', $tests));
输出:
array (
0 => 0,
1 => 3,
2 => 1,
3 => 2,
4 => 8,
5 => 10,
)