Тут вчера был вопрос, приведший к такой вот задаче: нужно найти сумму цифр числа на языке C, не используя ветвления вообще - ни if, ни ?:, ни циклов, ни &&, ни ||.
На всякий случай: я не школьник, мне полное решение не нужно (тем более, что я его уже написал) . Просто приятно было решить чуть-чуть нетривиальную задачу.
П. С. Программистов на лиспе прошу не беспокоиться, я понимаю, что элементарно :)
Другие языки программирования и технологии
Забавная задача: сумма цифр на C без ветвления
Вот такой вариант (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;
}
#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;
}
#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;
}
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
невнимательно прочитал условие) ) Бывает.
Макс Митюков
Что, неужели так сложно? Вроде всего две вещи надо сообразить, одна - элементарная.
Ну насколько я понимаю, в рещении
while (n>0) { s += n % 10; n /= 10; }
Условие нужно только, чтобы не повторять цикл максимально долго.
Для инт16 получается 5 разрядов и 5 строк s += n % 10; n /= 10;
Для инт32 - 10 разрядов и 10 строк.
А зачем тут условия, амперсанды и прочие || - я не понял :)
while (n>0) { s += n % 10; n /= 10; }
Условие нужно только, чтобы не повторять цикл максимально долго.
Для инт16 получается 5 разрядов и 5 строк s += n % 10; n /= 10;
Для инт32 - 10 разрядов и 10 строк.
А зачем тут условия, амперсанды и прочие || - я не понял :)
Макс Митюков
Сказано - циклы тоже не использовать.
Про указатель на функцию и массив тоже мысля была, реализацию приводить не буду, т. к. уже есть.
Вариант на 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;
}
Вариант на 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 ))
Макс Митюков
Это вопрос или утверждение?
Похожие вопросы
- Помогите пожалуйста разобрать задачу по програмированию на C++.
- Бесконечная сумма на языке C
- Дано натуральное число п. Найти знакочередующуюся сумму цифр числа n:
- Задача по программированию на C++ C++ C++ C++, не на Pascal
- Вычисление суммы ряда на c++
- Помогите решить задачу в visual studio c++
- <<ПОМОГИТЕ! НАПИСАТЬ ПРОГРАММУ НА СИ ИЛИ ПАСКАЛЕ КОТОРАЯ ВЫВОДИТЬ СУММУ ЦИФР ЧИСЛА ОТ 1 ДО N
- Как сделать проверку на букв или цифру в c++
- Подсчитать количество 3-значных чисел,сумма цифр которых меньше либо равна 24
- Требуется найти минимальное натуральное число с суммой цифр 123, которое делится на 1237 кто знаетпомогите алгоритмом!
#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;
}