zoukankan      html  css  js  c++  java
  • 挑战编程:幸运数(失败案例)

    题目描述:


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

  • 相关阅读:
    【Source教程】Crowbar下载部署与使用方法
    【Source教程】VTFEdit下载安装与使用方法
    【Source教程】GCFScape下载安装与使用
    【Source教程】文章目录
    【资源导航】我所用到过的工具及下载地址
    C# MVC LayUI实现下拉框二级联动
    ASP.NET MVC+Echarts绘制统计图表
    ArcMap操作随记(9)
    ArcMap操作随记(8)
    ArcMap操作随记(7)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3193987.html
Copyright © 2011-2022 走看看