题目描述:
如果一个数各个数位上的数字之和是质数,并且各个数位上的数字的平方和也是质数,则称它为幸运数。
给定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 j ; for (j = 0; j < iAddPrimeTotal; j ++) { if (iAddSum == addPrimeArr[j]) { 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]; for(g = 0; g < iSqrtAddPrimeTotal; g++) { if (isqrtSum == sqrtAddPrimeArr[g]) { iLuckyNumber ++; break; } } break; } } } return iLuckyNumber; } //start 提示:自动阅卷起始唯一标识,请勿删除或增加。 int main() { printf("lucky number is %d", lucky(1, 20)); //main函数方便你自行测试,可不用完成 } //end //提示:自动阅卷结束唯一标识,请勿删除或增加。
挑战失败了,公布出源代码!查查原因,估计是限时3秒导致失败的……