版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Matthew_Fan/article/details/9338501
题目描述:
如果一个数各个数位上的数字之和是质数,并且各个数位上的数字的平方和也是质数,则称它为幸运数。
给定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,请完成函数,实现上述功能。
挑战规则:
如果一个数各个数位上的数字之和是质数,并且各个数位上的数字的平方和也是质数,则称它为幸运数。
给定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 //提示:自动阅卷结束唯一标识,请勿删除或增加。