题解 | #约数的个数#

约数的个数

https://www.nowcoder.com/practice/04c8a5ea209d41798d23b59f053fa4d6

这道题思想不难,判断一个数n的约数的个数,不需要从1遍历到n,只需要从1遍历到sqrt(n),因为每有一个小于sqrt(n)的因子,相对应的都会有一个大于sqrt(n)的因子。了解思想后,看下面的代码:

#include <bits/stdc++.h>
#include <cmath>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> arr(n);
    for(int i = 0; i < n; i++) cin >> arr[i];

    for(int i = 0; i < n; i++){
        if(arr[i] == 1){
            cout << 1 << '\n';
            continue;
        }

        int num = arr[i];
        int s = sqrt(num);
        int ans = 0;
        for(int i = 1; i < s; i++){
            if(num % i == 0){
                ans += 2;
            }
        }
        if(num % s == 0) ans ++;
        cout << ans << '\n';
    }
}

这个代码正是运用了上述思想,但是它存在问题,因为int s = sqrt(num),那么s <= sqrt(num),也就是说有时s是小于sqrt(num)的(因为sqrt(num)到Int型,去掉小数点后的数),这就导致 i 其实是小于 sqrt(num)的,却没有遍历到。比如说num = 3,sqrt(3)约等于1.7,而int s = sqrt(num)后,s = 1,这就导致是3的约数的1压根都没能遍历,所以需要改进,改进如下:

#include <bits/stdc++.h>
#include <cmath>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; i++) cin >> arr[i];

    for (int i = 0; i < n; i++) {
        if (arr[i] == 1) {
            cout << 1 << '\n';
            continue;
        }

        int num = arr[i];
        int ans = 0;
        int j;
        for (j = 1; j * j < num; j++) {
            if (num % j == 0) {
                ans += 2;
            }
        }
        if (j * j == num) ans++;
        cout << ans << '\n';
    }
}
// 64 位输出请用 printf("%lld")

我们让每个数j,判断j * j是否小于num,这样就没有因为sqrt(num)转到int型时的不精确导致的错误了

全部评论

相关推荐

昨天 11:18
门头沟学院 Java
作者先叠个甲:本人双非本,秋招拿到了多个大厂offer,这个过程也不容易,但是在看到很多秋招胜利之后说自己一路有多艰辛的文章,总感觉有一点不对劲,想了很久打算写一篇文章分析一下,本文仅代表作者观点,不认同的可以在评论区大家一起理性讨论。&nbsp;秋招已经结束,各类社交平台出现一大批“大厂上岸”胜利结算。文章的叙事逻辑高度相同,开篇就渲染焦虑和困惑,学习时的挑灯夜读、投递时的屡屡碰壁、面试时的如履薄冰,将过往经历包装成一步艰辛的“奋斗史”,然后最终以大厂offer的胜利结尾,字里行间全是苦尽甘来的优越感。但是在我看来,这类文章的本质是结果导向的、带有浮夸的叙事,因为其内核不是分享经验,而是借“苦难”之名...
创作小队长:你的批判视角非常犀利,尤其“结果决定叙事权”的洞察非常精准,哈哈想邀请你来成为我们的创作者🫰 但我想补充一个视角:许多分享者的初衷并非炫耀结果或者苦难,我更愿意相信他们在这个过程中付出了很多,在这场战役结束后,他们迫不及待地想被看到,记录和分享都是给自己的一个交代,而非真的教会别人什么,他们的初衷未必是想制造焦虑。求职市场的残酷、经济环境的下行、世俗价值观才是这种叙事流行的土壤,作为一个普通人无法抵抗洪流。 感谢你发起这场讨论。理想的社区,既需要这样锐利的批判来保持清醒,你的洞察非常犀利,也许会启发一些人,能逐渐改变这种叙事~
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务