Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

吐血 没改之前计算99999999这个数据用了2s多,改了之后只用了16ms,相差甚大啊

Posted by 194325 at 2012-09-26 17:24:54 on Problem 1142
这个是AC的代码(暴力滴,AC耗时47ms):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int cut(int m)  /*	计算组成一个数的各个数字的和*/
{
	int k = 0;
	while(m)
	{
		k += m%10;	m/=10;
	}
	return k;
}

bool isprime(int m)
{
	if(m==1) return false;
	if(m==2) return true;
	for(int i=2;i<=(int)sqrt(m+0.5)+1;i++)
	{	
		if(m%i==0)	return false;
	}
	return true;
}

int prime_factor_sum (int m)
{
	int k = 0;
	queue<int>q;
	for(int i=2;m!=1||m!=0;)
	{
		if(m%i==0&&isprime(i))
		{
			q.push(i);
			m/=i;
			if(isprime(m)) 
			{	q.push(m);break;	}
		}
		else i++;
	}
	int s;
	while(!q.empty())
	{
		s= q.front();
		q.pop();
			k += cut(s);
	}
	return k;
}
int main()
{
	int n,sum; 
	while(scanf("%d",&n)!=EOF&&n)
	{
		while(1)
		{
			++n;
			if(isprime(n)) continue;
			sum = cut(n);
			if(sum == prime_factor_sum(n))
			{		
				break;
			}
		}
		printf("%d\n",n);
	}
	return 0;
} 





原来的超时程序只有isprime()函数不同,代码如下:
bool isprime(int m)
{
	if(m==1) return false;
	if(m==2) return true;
	for(int i=2;i<=m/2+1;i++)
	{	
		if(m%i==0)	return false;
	}
	return true;
}


把for(int i=2;i<=m/2+1;i++)改成for(int i=2;i<=(int)sqrt(m+0.5)+1;i++)就AC了,无语吧    O(∩_∩)O哈哈~



Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator