情景介绍
今天在做一个算法题目的时候,发现,当使用sqrt()方法进行开方的时候,一直存在提交不通过的情况。
问题分析
对数据不断分析后,发现对35进行开方后,仍然满足条件,这就存在问题。
sqrt(35) = 5.91608
但是当我们运行以下代码的时候,却能够成立!
cout<< sqrt(35)*sqrt(35);//35
通过计算器计算和源码的分析发现问题所在!
在 C++ 中,sqrt
函数可以接受一个 double
类型的参数,并返回一个 double
类型的值。这意味着 sqrt
函数的精度是有限的,取决于 double
类型能够表示的精度。
所以当我们使用sqrt()来判断是否为整数的时候,会出现不准确的问题!!!
这时,我们需要一种新的方法来确定一个数开方后是否为整数,那就是floor()方法。
#include <cmath>
#include <iostream>
int main() {
double number;
std::cout << "请输入一个数:";
std::cin >> number;
double squareRoot = sqrt(number);
if (squareRoot == floor(squareRoot)) {
std::cout << "这个数的平方根是整数。" << std::endl;
} else {
std::cout << "这个数的平方根不是整数。" << std::endl;
}
return 0;
}
在这个代码中,首先输入一个数。然后计算这个数的平方根,并使用 floor
函数将结果向下取整。如果取整后的平方根与原来的平方根相等,说明这个数的平方根是整数;否则,说明这个数的平方根不是整数。
那结合到我们这个问题当中,只需要将我们的sqrt(n)*sqrt(n)==n进行替换即可!
代码实现
#include<iostream>
#include<cmath>
#include <typeinfo>
using namespace std;
int main(){
int n;
cin>>n;
int total=0;
for(int i=1;i<sqrt(n);i++){
if(n%i==0&&n!=1){
total=total+2;
}
}
double squareRoot = sqrt(n);
if(squareRoot == floor(squareRoot)){
total++;
}
cout<<total;
return 0;
}