Моя догадка getchar
- это ваше узкое место. Вы можете попробовать чтения в больших кусков в то время:
#include <cstdio>
#include <cctype>
#define BUFFER 2048
#define OFFSET ('A' - 1)
#define MODULUS 26
using namespace std;
int main()
{
char buffer[BUFFER];
int count, done = 0, multiply = 1;
while (!done && (count = fread(buffer, sizeof(char), BUFFER, stdin)))
{
for (int i = 0; i < count; i++)
{
if (isupper(buffer[i]))
{
multiply *= (buffer[i] - OFFSET);
multiply %= MODULUS;
}
else
{
done = 1;
break;
}
}
}
printf("%02d\n", multiply);
return 0;
}
фиксируется также вверх printf
и удалены магические числа. Он работает с тестовыми примерами.
Один пункт отметить, что если вы получаете результат ноль после операции модуля, то нет смысла продолжать, потому что ваш продукт всегда будет равен нулю после этого, так что вы можете сделать ярлык там:
#include <cstdio>
#include <cctype>
#define BUFFER 2048
#define OFFSET ('A' - 1)
#define MODULUS 26
using namespace std;
int main()
{
char buffer[BUFFER];
int count, done = 0, multiply = 1;
while (!done && multiply && (count = fread(buffer, sizeof(char), BUFFER, stdin)))
{
for (int i = 0; multiply && i < count; i++)
{
if (isupper(buffer[i]))
{
multiply *= (buffer[i] - OFFSET);
multiply %= MODULUS;
}
else
{
done = 1;
break;
}
}
}
printf("%02d\n", multiply);
return 0;
}
Чтение в кусках и оптимизация ярлыков может быть тем, что вам нужно, чтобы выиграть время.
Я сделал коррекцию и изменил ее на неподписанный int, но я все еще получаю ограничение по времени. Я не знаю, действительно ли это скорость, или если что-то другое заставляет замораживать программу, когда я ее загружаю. –
Я думаю, что вы можете избавиться от 'iostream' include? iiuc есть некоторый статический материал инициализации, который добавляется в вашу программу, когда вы включаете этот заголовок. но здесь должно быть довольно минимально ... каков срок? –
почему вы читаете до "\ n"? вы уверены, что вводимые вами данные «\ n» завершены? Я не видел этого в заявлении. я думаю, это говорит о первой линии ... хм ... –