Решил тряхнуть стариной и порешать олимпиадные задачки по программированию. Поскольку последний раз на олимпиаде был лет 15 назад, то решил начать с самых простых задач. Итак условие:
A+B
(Время: 1 сек. Память: 16 Мб Сложность: 2%)
Требуется сложить два целых числа А и В.
Входные данные
Даны две строки в которых записано два натуральных числа, не превышающих 10^9.
Выходные данные
Нужно вывести одно целое число — сумму чисел А и В.
Через пятнадцать минут у меня получилось следующее:
#include <algorithm>
#include <iostream>
#include <string>
const std::string DIGITS = "0123456789ABCDEF";
const size_t BASE = DIGITS.length();
int main(int argc, char* argv[])
{
std::string first = "FF09";
std::string second = "EDFA";
std::cout << first << " + " << second << " = ";
std::string result;
bool overflow = false;
std::string::reverse_iterator firstIt = first.rbegin();
std::string::reverse_iterator secondIt = second.rbegin();
const size_t maxLength = std::max(first.length(), second.length());
for (size_t i = 0; i != maxLength; ++i)
{
size_t firstValue = 0;
if (firstIt != first.rend())
{
firstValue = DIGITS.find(*firstIt);
++firstIt;
}
size_t secondValue = 0;
if (secondIt != second.rend())
{
secondValue = DIGITS.find(*secondIt);
++secondIt;
}
size_t resultValue = firstValue + secondValue + (overflow ? 1 : 0);
if (resultValue >= BASE)
{
resultValue -= BASE;
overflow = true;
}
else
{
overflow = false;
}
result.push_back(DIGITS[resultValue]);
}
if (overflow)
{
result.push_back(DIGITS[1]);
}
std::reverse(result.begin(), result.end());
std::cout << result << std::endl;
return 0;
} |
А вот что оказалось в ответе:
#include < stdio.h >
int main()
{
char sa[] = "1";
char sb[] = "9";
long a,b;
sscanf(sa,"%ld",&a);
sscanf(sb,"%ld",&b);
printf("%ld",a+b);
return 0;
} |
Заставило крепко задуматься...