XDOJ Problem 1003 - 最喜欢的数字 Time Limit Exceeded

/*********************************
 *    日期:2013-1-30
 *    作者:SJF0115 
 *    题目:XDOJ Problem 1003 - 最喜欢的数字 
 *    来源:http://acm.xidian.edu.cn/land/problem/detail?problem_id=1003
 *    结果:Time Limit Exceeded
 *    总结:简单的动态规划,先筛选出1-100000内的素数。 
            设f[i]=把i变成1的最少操作,则: f[1]=0; f[素数]=1; 
                                            f[i*素数]=min(f[i]+1,f[i*素数-1]+1);(因为有两种手段:m=m/p;m=m-1)
**********************************/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int prime[100001];
int f[100001];
//筛选素数
int Prime(){
	int i,j;
	for(i = 1;i < 100001;i++){
		if(i%2 == 0)//偶数      
		{    
			prime[i] = 0;    
        }    
        else//奇数    
        {    
			prime[i] = 1;    
		}    
	}
	for(i = 3; i <= sqrt(100001); i+=2)  
    {        
		if(prime[i])//奇数  
		{  
			for(j = i+i;j < 100001;j+=i)//奇数的倍数  
			{  
				prime[j] = 0;  
			}  
		}  
	}
	prime[2] = 1;
	return 0;
}
//选择较小者
int Min(int x,int y){
	if(x < y){
		return x;
	}
	else{
		return y;
	}
}
int main()
{
	int a,b;
	Prime();
	//freopen("C:\\Users\\SJF\\Desktop\\acm.txt","r",stdin);
	while(scanf("%d %d",&a,&b)!=EOF)
	{
		int i,j;
		int count = 0;
		f[1] = 0;
		//f[素数]=1
		for(i = 2;i < 100001;i++){
			if(prime[i] == 1){
				f[i] = 1;
			}
		}
		//f[i*素数]=min(f[i]+1,f[i*素数-1]+1)
		for(i = 2;i < 100001/2;i++){
			for(j = 2;j < 100001 && i*j < 100001;j++){
				if(prime[j] == 1){
					f[i*j] = Min(f[i]+1,f[i*j-1]+1);
				}
			}
		}
		for(i = a;i <= b;i++){
			count += f[i];
		}
		printf("%d\n",count);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值