我试图找出给定范围内的完美正方形的数量。我关注的方法在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;
}
答案 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;
}