#include
#include
#include
#include
using namespace std;
#define LIMIT 20
bool is_troich(char c)
{
return c == '0' || c == '1' || c == '2';
}
void input(char * num)
{
int i = 0;
char c;
while( i < LIMIT )
{
// c = cin.getchar();
c = cin.get();
if(c == '\n' || c == '\r')
break;
else if(!is_troich(c))
{
cout << "Invalid number!" << endl;
exit(1);
}
num[i++] = c;
num[i] = '\0';
}
if(!i)
{
cout << "Wrong number!" << endl;
exit(1);
}
}
int to_dec(char * num)
{
int dec = 0;
int len = strlen(num);
for(int x = len - 1, y = 0; x >= 0; x--, y++)
dec += (num[y] - '0') * pow(3.0,x);
return dec;
}
int main()
{
char num[LIMIT + 1];
input(num);
cout << to_dec(num) << endl;
return 0;
}
ПапаВысший разум (121730)
1 год назад
Откуда вы только берётесь такие незамутнённые? Какой, пардон мон франсэ, в задницу, pow(3.0, x), для целых степеней? pow - очень дорогая операция, её целесообразно использовать только для дробных показателей, и то не для всех, квадратные и кубические корни быстрее вычислять дихотомией, чем pow. А такие полиномы, как в задании, вообще вычисляются без всяких степеней.
((((a₀ · x) + a₁) · x + a₂) · x + a₃) · x + ...
где a₀ - старшая цифра, x - основание системы счисления.
Линейное количество умножений и сложений, проще некуда.
Sample Input 1:
21021
Sample Output 1:
196
Sample Input 2:
10000
Sample Output 2:
81