回 帖 发 新 帖 刷新版面

主题:VC编程的大数据问题。。。 (ACM)

我在做VC编程题过程中,经常会遇到大数据的问题,通常程序的限时是1秒,题目通常比较简单,但是给出的测试数据范围很大,通常上百万或者更多,这样用普通的方法通常会超时。。。这类问题应该怎样解决?
大虾们教教,谢谢!

这里给个我正在做的例题,题目大意是:
定义一种Semi-Prime Number,他是由两个质数(素数)的乘积构成,如6=2*3,10=5*2。。。
现要求给定一个数,要求判断这个数是否为Semi-Prime Number,是的输出yes,不是输出no;
测试数据n (2 =< n <=1000000);
以EOF为测试结束。

回复列表 (共6个回复)

沙发


#include "stdio.h"
#include "stdlib.h"
int prime(long int key){
    long int i=2;
    for(i=2;key%i!=0;i++);
    if(i==key)return 1;
    else return 0;
}
void main(){
    long int spn,i=2;
    printf("输入一个数,判断它是否两素数的乘积:\n");
    scanf("%ld",&spn);
    for(i=2;(i<spn)&&(!prime(i)||(spn%i)!=0||!prime(spn/i));i++);
    if(i==spn)printf("%ld不是两素数积",spn);    
    else printf("%ld=%ld*%ld",spn,i,spn/i);
}


板凳

还是很慢,其实速度也没提升什么哦,我测试了一个2345678,半天响应不了,昏

3 楼

先做一个1000以内的素数表? 1000以内的素数可以直接用二分法查,超过1000就用这个表筛.
////////////////////////////
#include <iostream>
#include <cmath>

using namespace std;

void makeprimetable (int tab[], int n)
{
    int i, cnt;
    tab[0] = 2;

    for (i = 3, cnt = 1; cnt < n; i += 2) {
        int lim = (int)sqrt ((double)i);
        int j;
        for (j = 0; tab[j] <= lim && i % tab[j]; ++j);
        if (tab[j] > lim) {
            tab[cnt] = i;
            cnt++;
        }
    }            
}

bool binsearch (int tab[], int n, int num)
{
    int low = 0, high = n - 1, mid;

    while (low < high) {
        mid = (low + high)/2;
        if (num <= tab[mid])
            high = mid;
        else
            low = mid + 1;
    }
    return tab[low] == num;
}

int main ()
{
    const int n = 168;
    int tab[n];

    makeprimetable (tab, n);
    for (int i = 0; i < n; ++i)
        cout << tab[i] << ' ';
    cout << endl;
    cout << binsearch (tab, n, 997) << endl;
    return 0;
}

4 楼

我一直还是理解 using namespace std是什么作用```大哥能解说一下吗?

5 楼

这不是一类问题,而是做ACM题都要考虑的。看完问题后再看时/空限制,再看数据范围,然后再想怎么解。

测试数据n (2 =< n <=1000000);

这样的n如果非素数,则必存在一个素因子p,2<=p<1000,而n/p也在这个范围内,也可以筛出来。

素数表可以直接用数组保存,不用运行程序的时候算。

其实素数在整数里面是很少的,而且越往后越稀。

6 楼

哦,谢了

我来回复

您尚未登录,请登录后再回复。点此登录或注册