找到给定范围内的完美正方形的数量

时间:2016-01-02 20:08:30

标签: c++ math range

我试图找出给定范围内的完美正方形的数量。我关注的方法在digital_root

上提供

我实施的代码有时没有给出正确的答案,因为这种方法不考虑10,1000等数字。

请帮我解决这个问题。

 int cot=0;
void squares(int a,int b){
    if(a==b){
        int digit,digit_root=0,no;
        no=a;
        digit=no%10;
        if(digit==2||digit==3||digit==7||digit==8){
        }else{
            no=a;
            while(no>0){
            digit=no%10;
            if((digit==0)||(digit==9)){

            }else{
                digit_root=digit_root+digit;
                digit_root=digit_root%9;
            }
            no=no/10;
    }
            if(digit_root==0||digit_root==7||digit_root==1||digit_root==4){
                if(digit_root==1){
                    if(a)
                }
                cot++;
            }
        }

        }else{
        int c=(a+b)/2;
        squares(a,c);
        squares(c+1,b);
    }


}

int main() {
   int a,b,t;
    cin>>t;
    for(int i=0;i<t;i++){
     cin >> a>>b;
    squares(a,b);   
        cout << cot<<endl;
        cot=0;
    }

    return 0;
}

4 个答案:

答案 0 :(得分:2)

最好的算法可能是减去sqrt(bigger number) - sqrt(other num),即这样的

int a = 1,b=100;
if (sqrt(a) != int(sqrt(a)){
    cout<<int(sqrt(b))-int(sqrt(a))<<endl;}
else{
    cout<<int(sqrt(b))-int(sqrt(a))+1<<endl;}

逻辑非常简单,完美的正方形是自然数*相同的自然数,1 * 1,2 * 2,3 * 3,4 * 4等等

所以你只需要获得较大数量的最接近的完美sqrt并用较小的num减去它(只要小心,因为最小的数字本身是一个完美的正方形)

答案 1 :(得分:1)

这里发生了太多事情。简化它。编写一个函数,确定单个数字是否是完美的正方形。让工作正常。然后使用该函数确定您的范围内有多少个完美的正方形。这可能不应该是递归的;这太难以理解了。使用涵盖范围的循环:

for (int i = a; i <= b; ++i)
    if (is_perfect_square(i))
        ++count;

答案 2 :(得分:1)

你不需要所有这些昂贵的计算。 这里的事情非常简单。

而不是从A到B的循环并检查完美的正方形, 我们可以在O(1)处计算出A的第一个整数平方根 用简单的幂增量n计算其余的完美正方形, 最多B.通过这种方式,我们可以避免昂贵的计算。

但更好的是,我们甚至可以通过使用ceil和floor来避免循环。 例如,1000到2000之间的平方数:

sqrt(1000) = 31.6  --> ceil(31.6) --> 32
sqrt(2000) = 44.7  --> floor(44.7)--> 44

因此,这两个加1的差异给出了正方形的数量。

#include <cmath>
#include <iostream>
using namespace std;
int main() {
    int  A, B;
    //get the range [A,B]
    cin >> A >> B;
    cout << floor(sqrt(B)) - ceil(sqrt(A)) + 1 << end;
    return 0;
}

答案 3 :(得分:0)

打印从1到N的数字很容易,数字将是完美的正方形。

这是检查完美正方形的逻辑

    /*function definition to check perfect square*/
int isPerfectSquare(int number)
{
    int iVar;
    float fVar;

    fVar=sqrt((double)number);
    iVar=fVar;

    if(iVar==fVar)
        return 1;
    else
        return 0;
}