Другие языки программирования и технологии

Забавная задача: сумма цифр на C без ветвления

Тут вчера был вопрос, приведший к такой вот задаче: нужно найти сумму цифр числа на языке C, не используя ветвления вообще - ни if, ни ?:, ни циклов, ни &&, ни ||.
На всякий случай: я не школьник, мне полное решение не нужно (тем более, что я его уже написал) . Просто приятно было решить чуть-чуть нетривиальную задачу.
П. С. Программистов на лиспе прошу не беспокоиться, я понимаю, что элементарно :)
Макс Митюков
Макс Митюков
96 448
Вот такой вариант (MinGW):

#include <stdio.h>
#include <stdlib.h>

int (*adr[2])(int x);

int sum(int a)
{
  return adr[!!a](a/10) + a % 10;
}

int ret(int x)
{
  return 0;
}

int main(int argc, char *argv[])
{
  adr[0] = &ret;
  adr[1] = ∑
  printf("%i\n", sum(123));
  printf("%i\n", sum(6543201));
  system("PAUSE");
  return EXIT_SUCCESS;
}
ЖШ
Женя Шаныгин
51 590
Лучший ответ
Женя Шаныгин Вариация на эту же тему, но с одной функцией с оглядкой на это решение и на варианты Юрия-17 и ra. Тоже MinGW, Win XP x86:

#include <stdio.h>

int sum(int n)
{
  goto *(void *)((int)(&&ret) * (!n)) + ((int)(&&rec) * (!!n));
  ret: return 0;
  rec: return sum(n / 10) + n % 10;
}

int main(int argc, char *argv[])
{
  printf("%d\n", sum(12345));
  printf("%d\n", sum(951357));
  return 0;
}
Макс Митюков Четвертый раз пытаюсь "лучший ответ" поставить - пишет, что не ошибается тот, кто не делает...
#include<stdio.h>
int func(int n)
{
static int s=0;
char ret = 0xc3;
s+=n % 10;
( (int (*)(int)) ( (((int)func) & (-!!n)) + ((int)&ret & (-!n)) ) ) (n/=10);
return s;
}

int main()
{
printf("%d\n",func(129));
return 0;
}
Сергей Кузин Запросто может не работать, т.к. здесь undefined behavior
невнимательно прочитал условие) ) Бывает.
Дима ))))))
Дима ))))))
40 015
Макс Митюков Что, неужели так сложно? Вроде всего две вещи надо сообразить, одна - элементарная.
Ну насколько я понимаю, в рещении
while (n>0) { s += n % 10; n /= 10; }
Условие нужно только, чтобы не повторять цикл максимально долго.
Для инт16 получается 5 разрядов и 5 строк s += n % 10; n /= 10;
Для инт32 - 10 разрядов и 10 строк.
А зачем тут условия, амперсанды и прочие || - я не понял :)
Андрей Великий
Андрей Великий
34 701
Макс Митюков Сказано - циклы тоже не использовать.
Про указатель на функцию и массив тоже мысля была, реализацию приводить не буду, т. к. уже есть.

Вариант на C++, если можно конечно)

#include <iostream>

int sum;

template< int val >
struct Sum {
Sum<val/10>a;
Sum(){ sum += val % 10; }
};

template<> struct Sum<0> { ~Sum(){ std::cout << sum; }};

int main() {
Sum<123>a;
}
можно решение в pm ))
Almas Shalkarbay
Almas Shalkarbay
181
Макс Митюков Это вопрос или утверждение?