主题:VC编程的大数据问题。。。 (ACM)
dttxwd1986
[专家分:0] 发布于 2006-07-16 12:17:00
我在做VC编程题过程中,经常会遇到大数据的问题,通常程序的限时是1秒,题目通常比较简单,但是给出的测试数据范围很大,通常上百万或者更多,这样用普通的方法通常会超时。。。这类问题应该怎样解决?
大虾们教教,谢谢!
这里给个我正在做的例题,题目大意是:
定义一种Semi-Prime Number,他是由两个质数(素数)的乘积构成,如6=2*3,10=5*2。。。
现要求给定一个数,要求判断这个数是否为Semi-Prime Number,是的输出yes,不是输出no;
测试数据n (2 =< n <=1000000);
以EOF为测试结束。
回复列表 (共6个回复)
沙发
skybtone [专家分:160] 发布于 2006-07-16 14:21:00
#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);
}
板凳
skybtone [专家分:160] 发布于 2006-07-16 14:30:00
还是很慢,其实速度也没提升什么哦,我测试了一个2345678,半天响应不了,昏
3 楼
euc [专家分:4310] 发布于 2006-07-16 16:11:00
先做一个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 楼
skybtone [专家分:160] 发布于 2006-07-16 17:34:00
我一直还是理解 using namespace std是什么作用```大哥能解说一下吗?
5 楼
rickone [专家分:15390] 发布于 2006-07-16 19:02:00
这不是一类问题,而是做ACM题都要考虑的。看完问题后再看时/空限制,再看数据范围,然后再想怎么解。
测试数据n (2 =< n <=1000000);
这样的n如果非素数,则必存在一个素因子p,2<=p<1000,而n/p也在这个范围内,也可以筛出来。
素数表可以直接用数组保存,不用运行程序的时候算。
其实素数在整数里面是很少的,而且越往后越稀。
6 楼
dttxwd1986 [专家分:0] 发布于 2006-07-17 08:39:00
哦,谢了
我来回复