关于c++中数据sqrt() 精度问题

情景介绍

今天在做一个算法题目的时候,发现,当使用sqrt()方法进行开方的时候,一直存在提交不通过的情况。

问题分析

对数据不断分析后,发现对35进行开方后,仍然满足条件,这就存在问题。

cpp 复制代码
sqrt(35) = 5.91608 

但是当我们运行以下代码的时候,却能够成立!

cpp 复制代码
cout<< sqrt(35)*sqrt(35);//35

通过计算器计算和源码的分析发现问题所在!

在 C++ 中,sqrt 函数可以接受一个 double 类型的参数,并返回一个 double 类型的值。这意味着 sqrt 函数的精度是有限的,取决于 double 类型能够表示的精度。

所以当我们使用sqrt()来判断是否为整数的时候,会出现不准确的问题!!!

这时,我们需要一种新的方法来确定一个数开方后是否为整数,那就是floor()方法。

cpp 复制代码
#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进行替换即可!

代码实现

cpp 复制代码
#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;  
}

最后效果

相关推荐
旖旎夜光13 小时前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
程与留13 小时前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt
CRMEB定制开发14 小时前
2026年最值得推荐的10大开源商城系统盘点
开发语言·人工智能·开源·商城系统·小程序商城
buhuizhiyuci14 小时前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
Littlehero_12116 小时前
QT自定义控件之热换站系统(源码开源)
开发语言·qt
meilindehuzi_a16 小时前
Python 基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python
caimouse16 小时前
ReactOS 窗口系统分析(5):可见区域与窗口 DC — vis.c + windc.c
c语言·开发语言
OPEN-F16 小时前
Python进阶教程:装饰器与生成器深入
开发语言·python
千里码aicood17 小时前
基于Python的电商数据采集系统(大数据+爬虫)
开发语言·python
_Narcissus_17 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径