求出给定范围内的完美正方形的数量

finding the number of perfect squares in the given range

本文关键字:完美 正方形 范围内      更新时间:2023-10-16

我正试图找出给定范围内的完美正方形的数量。我下面的方法提供在:digital_root

我实现的代码有时不能给出正确的答案,因为这种方法不考虑101000等数字。

请帮我算出这个方法。

 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;
}

最好的算法可能是减去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;}

逻辑很简单,完全平方是自然数*相同的自然数so,1*1,2*2,3*3,4*4等等

因此,您只需要获得较大num的最接近的完美sqrt,并将其与较小num相减(只是要小心,以防最小num本身是完美平方)

这里发生的事情太多了。简化它。写一个函数来确定一个数字是否是一个完美的正方形。把它做好。然后使用这个函数来确定你的范围内有多少个完美的正方形。这可能不应该是递归的;这太难理解了。使用覆盖范围的循环:

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

打印从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;
}

您不需要所有这些昂贵的计算。这里的事情真的很简单。

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

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

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

因此,这二加一的差就给出了完美平方的个数。

#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;
}