挑战编程:幸运数(失败案例,运行时间超过3秒)

题目描述:


如果一个数各个数位上的数字之和是质数,并且各个数位上的数字的平方和也是质数,则称它为幸运数。
给定x,y,求x,y之间( 包含x,y,即闭区间[x,y])有多少个幸运数。
例如1到20之间有4个幸运数,它们是11,12,14,16,像因为1+1 = 2是质数,1^2 + 1^2 = 2也是质数等等。
给定函数原型,其中1<=x<=y<=1000000000,请完成函数,实现上述功能。


挑战规则:

可额外编写其它的函数,然后lucky调用你编写的其它函数返回结果值; 限时3s,程序运行时间超过3s即挑战失败

#include <string>
#include <stdio.h>
#include <cmath>
#include <iostream>
using namespace std;

int lucky(int x,int y) {
	int iLuckyNumber = 0;
	int iSqrtAddMax = 729; // 最大的每位数平方之和
	int iAddMax = 81; // 最大的每位数之和


	int sqrtAddPrimeArr[729] = {0}; // 存放[1,729]之间的质数
	int iSqrtAddPrimeTotal = 0; // 记录[1,729]之间的质数数目
	int addPrimeArr[81] = {0}; // 存放[1.81]之间的质数
	int iAddPrimeTotal = 0; // 记录[1,81]之间的质数数目


	// 获取最大数之间的全部质数
	int i = 0 ,n = 0, j, g;
	for(n=2;n<=iSqrtAddMax;n++)  
	{    
		for (i=2; i*i<=n; i++)      
			if(n%i==0)break;  
		if (i*i > n)    
		{
			if (n <= iAddMax)
			{
				addPrimeArr[iAddPrimeTotal] = n;
				iAddPrimeTotal ++;
			}
			sqrtAddPrimeArr[iSqrtAddPrimeTotal] = n;
			iSqrtAddPrimeTotal ++;
		}
	}
	int POW10[10] = {0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
	for (n = x; n <= y; n ++)
	{
		int num = n;
		int numArr[10] = {0};
		for (i = 9; i > 0; i--)
		{
			numArr[i] = num / POW10[i];
			num = num % POW10[i];
		}
		numArr[0] = num;
		// 求每个位数值和
		int iAddSum = numArr[0] + numArr[1] + numArr[2] + numArr[3] + numArr[4] + numArr[5] +
			numArr[6] + numArr[7] + numArr[8] + numArr[9];

		int isqrtSum = numArr[0]*numArr[0] + numArr[1]*numArr[1] + numArr[2]*numArr[2] + numArr[3]*numArr[3] + 
			numArr[4]*numArr[4] + numArr[5]*numArr[5] + numArr[6]*numArr[6] + numArr[7]*numArr[7] + numArr[8]*numArr[8] + numArr[9]*numArr[9];
		
		int j ;
		for (j = 0; j < iAddPrimeTotal; j ++)
		{
			if (iAddSum == addPrimeArr[j])
			{
				for(g = 0; g < iSqrtAddPrimeTotal; g++)
				{
					if (isqrtSum == sqrtAddPrimeArr[g])
					{
						cout << "number = " << n << endl;
						iLuckyNumber ++;
						break;
					}
				}
				break;
			}
		}
	}

	return iLuckyNumber;
}



//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{   
	printf("lucky number is %d", lucky(1, 100));
	getchar();

	//main函数方便你自行测试,可不用完成
} 
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。     


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会唱歌的老樊

老少爷们,来个赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值