Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > попарное суммирование цифр числа


Автор: APro 24.12.2008, 08:37
Представим есть ряд чисел:

Код

9256431872


нужно разбить это число на отдельно 9, 2, 5, 6 и т.д. и после складывать первое со вторым, второе с третьим. (9+2, 2+5, 5+6 и т.д.), но если сумма есть двух значное число, то записываем только единицы. (например если 12, то нужно записать только 2)

и в итоге должно получиться:
Код

171074959


У кого какие идеи есть, чтобы это посчитать?

Автор: SneG0K 24.12.2008, 08:50
А ты обьясни в чем сложность? Ты не можеш строку на числа разобрать? Или тебе не хочется самому писать?

Автор: APro 24.12.2008, 10:44
Хорошо, я сейчас попробую в 100-ый раз сам, и если не получится, покажу код, а Вы попробуете объясняить где там ошибка ....

Автор: ТоляМБА 24.12.2008, 10:54
Код
<?php 
$a="9256431872";
$len=strlen($a);
$f=substr($a,0,1);
$res="";
for ($i=1;$i<=$len-1;$i++)
    {$s=substr($a,$i,1);
    $sum=$f+$s;
    If ($sum>9)
        {$sum=10-$sum;}
    $res="$res"."$sum";
    $f=$s;}
$res=str_replace("-","",$res); #Почему то выводил числа с "-", пришлось поставить эту ф-ию
echo "<br>$res";
?>

Автор: _zorn_ 24.12.2008, 11:02
deleted

Автор: DeamonShan 24.12.2008, 11:08
_zorn_, в твоем случае, если сумма будет ровняться 10, условие не выполнится... поэтому думаю 

Код

if($sum>9) $sum=$sum-10;


из условия, $sum больше 10-ти будет!

Автор: ТоляМБА 24.12.2008, 11:16
DeamonShan, блин, точно, а я наоборот из 10 вычитал - вот откуда минусы то и шли  smile . Если заменить на твой вариант, то тогда реплейс конечно можно убрать!

Автор: Рыжий 24.12.2008, 11:38
Тоже вариант:
Код

$s='987451235';

for($i=0;$i<strlen($s);$i++){
    if(!empty($s[$i+1])){
    //Сумма этого+следующего
    $sum=$s[$i]+($s[$i+1]);

    echo " Текущий - ".$s[$i].", следующий - ".$s[$i+1].", сумма = ".$sum."<br />";
    }      
}

Это же можно реализовать через array_walk() или другие циклы - сколько фантазии хватит. 
Еще не помешало бы добавить проверку на символы. Например $s может быть = "85475d  s59-%$".

Автор: theworldcreator 24.12.2008, 13:43
Цитата

Еще не помешало бы добавить проверку на символы. Например $s может быть = "85475d  s59-%$". 

Приведение к int:
Код

$int_var = (int)$main_var;

Автор: Рыжий 24.12.2008, 14:18
theworldcreator, При таком подходе, все знаки будут превращаться в 0, что даст ложные результаты.
Имхо нужно проверять заранее:
Код

$s='a'; 

if(is_int($r)) echo $r;
else die("Это не цифра!");


Автор: gibbzy 24.12.2008, 14:41
в чём проблема string есть массив из char  
Код

$f=substr($a,0,1);

это глупость
a php очень лояльная штука для преобразования переменных из одного типа в другой  

Автор: theworldcreator 24.12.2008, 16:47
Рыжий
Я имел ввиду изначально вместо проверки на "циферность" просто привести к int. Если это не число, из него получится ноль, а я думаю чувак, который пытается скормить ей(функции) текст не дебил и сам все поймет(без сообщения об ошибки).

Автор: APro 24.12.2008, 18:07
Спасобо ВСЕМ  smile Я оказывается был на верном пути. Мой код был немного похож на ТоляМБА, и, скажем, он один как бы меня исправил, за что получает "+"  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)