优化大型乘法C ++的模数

时间:2015-09-17 01:52:50

标签: c++ multiplication modulo

我试图制作我的程序,它用模数处理大数的乘法,更快。这是我目前的代码:

#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;
}

2 个答案:

答案 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;
}

读取块并快捷方式优化可能是您需要超越时间限制的。