更快速地检查数字是否可以用特定数字整除

时间:2013-12-01 21:51:38

标签: c++ division

#include <iostream>

using namespace std;

int main()
{
    long long n, k;

    cin >> n >> k;

    int num, count = 0;

    do{
        n--;
        cin >> num;
        if (num > 99 && (num % 10) % k == 0){
            //cout << num << endl;
            count++;
        }
        else if(num < 100 && (num % k) == 0){
            //cout << num << endl;
            count++;
        }
    }while(n);

    cout << count << endl;

    return 0;
}

我正在编写一个程序来检查特定号码是否可以被用户输入的特定号码整除。

n =输入的数字量 k =检查数字是否可分的数字

到目前为止,我的程序运作良好,但超出了时间限制。是否有比这更快的算法或代码来检查一个数字是否可以被另一个特定数字整除?

链接:http://www.codechef.com/problems/INTEST/

5 个答案:

答案 0 :(得分:3)

模数运算符(%)就是你想要的。例如:

if (k != 0)
    return n % k == 0;   

或空间坚持者:

if (k != 0)
    return !(n % k);

Modulo返回两个数字之间除法的余数,例如5%2返回1.如果余数为0,则数字可以整除(IE 4%2将返回0)。

http://en.wikipedia.org/wiki/Modulo_operation

答案 1 :(得分:3)

首先,这里的问题是从输入中快速读取数字,而不是进行除法。考虑到这一点,这里有一些快速阅读的代码:

vector<char> buffer(n * 10); // allocate a large buffer
cin.read(&buffer[0], buffer.size()); // fill the buffer with chars from input
buffer.resize(cin.gcount()); // cut buffer size to number of chars actually read
...

这将读取整个输入文件(请注意每个数字少于10位的缓冲区大小)。

然后,将字符序列转换为数字,并按knum % k != 0检查每个数字的可分性,正如其他人所注意到的那样)。可以在您发布的“复杂”解决方案中找到该代码(它只占用一行代码)。

答案 2 :(得分:2)

取代此代码段

    cin >> num;
    if (num > 99 && (num % 10) % k == 0){
        //cout << num << endl;
        count++;
    }
    else if(num < 100 && (num % k) == 0){
        //cout << num << endl;
        count++;
    }

你可以写简单

    cin >> num;
    count += num % k == 0;

答案 3 :(得分:2)

“问题”的关键在于大多数语言的标准I / O库都是非常通用的,因此当格式定义良好且性能至关重要时,它可能不是读取或写入数据的最佳工具。

在这种情况下,您正在使用库函数从IO流中读取,这些IO流是从底层存储系统中高度抽象的。通常,越接近硬件,代码运行的速度就越快。

我首先尝试使用像fopenfread这样的C文件IO函数将大量二进制数据从文件读入内存,然后“原位”处理该内存扫描数字并计算正确的匹配。循环直到没有更多的线要处理,并记住它更多更有效地读取大块数据。

答案 4 :(得分:0)

而不是使用     if(n%k!= 0) 使用,     int quotient = n / k;     if(商* k == n)

模数运算符比第二种方法慢。 (用模数运算符运行代码需要4.5秒,第二种方法需要1秒)