我试图制作我的程序,它用模数处理大数的乘法,更快。这是我目前的代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
long multiply = 1;
char x;
while ( (x = getchar()) != '\n' )
{
multiply = (multiply*(x-64))%26;
}
if (multiply < 10)
printf("0%d\n", multiply);
else
printf("%d\n", multiply);
return 0;
}
答案 0 :(得分:1)
(首先,我收到警告,因为您使用符号%d
来打印long
,可能您只能使用int
,因为它不会有所作为最大值为26。)
我认为你可以通过使用无符号整数类型来提高速度,因为对于无符号整数,modulo更简单一些。 (通过查看生成的程序集很难确定... https://goo.gl/LAc42f)
答案 1 :(得分:0)
我的猜测是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;
}
读取块并快捷方式优化可能是您需要超越时间限制的。