挑战编程:幸运数(失败案例)

题目描述:


如果一个数各个数位上的数字之和是质数,并且各个数位上的数字的平方和也是质数,则称它为幸运数。
给定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秒导致失败的……

原文地址:https://www.cnblogs.com/jiangu66/p/3193987.html