在对 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,
)