求1到n的所有正整数中,有多少个数的约数个数是奇数

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Description

hry在学小学数学的时候就在琢磨一个问题。。1到n的所有正整数中,有多少个数的约数个数是奇数?

Input

第一行有一个正整数T,表示有T组测试数据。 每组测试数据一行一个正整数n.
(1<=T<=10000,1<=n<=1000000000000000000)

Output

每组数据输出一行一个整数,表示1-n中有多少个数有奇数个约数。

Sample Input

5
1
2
3
4
5

Sample Output

1
1
1
2
2

解题思路一:
首先我们把问题分解,第一个问题是求约数个数,第二个是约数个数为奇数,第三个问题为1到n的所有正整数。由此我们可以判断这题的时间复杂度应该接近O(n^(3/2)),即1到n的循环遍历(O(n)),对每个正整数求奇数(O(n^(1/2)))。由此很容易得出下列代码:


C++代码:

#include<iostream>
using namespace std;

int f(long long n)
{
    int sum = 0;
    if (n == 1)
    {
        return 1;
    }
    for (int i = 1; i * i <= n; i++)
    {
        if (n % i == 0)
        {
            if (n / i == i)
            {
                sum++;
            }
            else
            {
                sum += 2;
            }
        }
    }
    return sum;
}

int main()
{
    int T;
    cin >> T;
    while (T > 0)
    {
        long long n;
        cin >> n;
        int count = 0;
        for (long long i = 1; i <= n; i++)
        {
            if (f(i) % 2 != 0)
            {
                count++;
            }
        }
        cout << count << endl;
        T--;
    }
    return 0;
}
/**************************************************************
    Problem: 2581
    Language: C++
    Result: Time Limit Exceed
****************************************************************/

显然这里结果是TLE,说明这个方法有点笨,肯定有比较trick的解法。因此我特地输出了几条数据,有了下面一个发现:


解题思路2:
在经过上面的总结之后,我发现了一个很有趣的规律。当一个数的约数为奇数时,他必为某个数的平方。这是已经有前人总结出来的结论,而我只不过是恰好也发现了这个规律。关于详细证明请参考这篇博客关于完全平方数的因子个数是奇数个的说明
因此这道题就很容易解了,只要计算出有多少个数是某个数的平方,或者说有多少个数开平方结果为正整数。这里我又发现一个小trick:1到n中有多少个数开平方结果为正整数的结果,与对n开平方取整的结果是一致的。所以这道题就可以轻而易举的解决:


C++代码:

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
    int T;
    cin >> T;
    while (T > 0)
    {
        long long n;
        cin >> n;
        int count = 0;
        count = int(sqrt(n));
        cout << count << endl;
        T--;
    }
    return 0;
}
/**************************************************************
    Problem: 2581
    Language: C++
    Result: Accepted
    Time:156 ms
    Memory:1496 kb
****************************************************************/
最大奇约数(递归 C++) 最大奇约数 总时限制: 1000ms 内存限制: 65536kB 描述 定义函数f(x)表示x的最大奇约数,这里x表示正整数。例如,f(20) = 5,因为20的约数从小到大分别有:1, 2, 4, 5, 10, 20,其中最大的奇约数为5。 给出正整数N,f(1)+f(2)+…+f(N) 输入 第1行:1正整数N 1&lt;=N&lt;=10^9 输出 第1行:1正整数... 阅读详情

相关推荐

网易编程题--最大的奇约数

1.题目小易是一个数论爱好者,并且对于一个数奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要出 f(1) + f(2) + f(3)…….f(N) 例如: N = 7 f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 +

SHENMEGUI_32的博客 700

看一个数多少奇数因子

/* * Copyright (c) 2013, 烟台大学计算机学院 * All rights reserved. * 作 者: 霍雨佳 * 完成日期:2013 年12月18日 * 版 本 号:v1.0 * 问题描述:计算给出数的所有奇数因子。 * 样例输入:30 * 样例输出:1,3,5,15 * 问题分析:计算给出数的所有奇数因子。 */ #include us

u012369069的专栏 1524

统计奇因数的个数

上机内容:运用指针 上机目的:重温编程感觉 /* * 程序的版权和版本声明部分 * Copyright (c)2012, 烟台大学计算机学院学生 * All rightsreserved. * 文件名称: fun.cpp * 作 者:黄兆宽 * 完成日期:2012 年 12 月 24 日 * 版本号: v1.0 * 对任务及解方法的描述部分:字符串中是否有相同的数字 * 输

黄兆宽=★=的专栏 1784

循环课后题型整理(二十道)

@TOC 1、判断2-100多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到 (这个数),如果能被整除,则表明此数不是素数,反之是素数。? //素数:只能被1和他本身整除;合数:还有其他因数。 //1、任意一个数如何判断其是否为质数(素数)。 /* int num=97; int count=0; for (int i = 2; i < num; i++) { if(num%i=

sanjiang521的博客 977

[1100]奇数不同因子整数多少个?其中最大的一个是什么数?用python

n= 0 while n<100: n=n+1 a=[] for i in range(1, n+1): if n % i == 0: a.append(i) print(a) print(len(a)) if len(a)%2==1: print(a) else: continue print("最大值为:",a[-1]) 新手

weixin_52418313的博客 6904

算法:1-N的最大奇数约数之和

算法:1-N的最大奇数约数之和算法描述思路一思路二 算法描述 前几天在网上看了一个算法,据说是网易的面试题,描述如下: f(x)为x最大的奇数约数,x为正整数。例如:f(44) = 11. 现在给出一个N(1 ≤ N ≤ 1000000000), 需要出 f(1) + f(2) + f(3)…f(N) 例如:N = 7 f(1) + f(2) + f(3) + f(4) + f(5) + f(...

1443

c语言编写程序,输入正整数n,计算0到n以内所有奇数的和,c语言输入正整数n,计算1~n中的奇数和以及偶数和并输出....

用C语言编写程序,输入一个正整数n(1#include"stdio.h"intmain(){\x09inti,j,n;\x09inta[12];\x09intmin,mx;\x09scanf("%d",&n);\x09for(i=0;i/* 计算正整数n所有因子(1和n除外)之和.(用C语言编程)#includevoidmain(){intn;ints=0;printf("请输入一个正整数...

weixin_28318011的博客 1万+

C++个数的最大奇数约数

题目: 定义函数f(x)为x的最大奇数约数,x为正整数,例如f(44) = 11. 现在给出一个N,需要出f(1) + f(2) + f(3) + … + f(N) 例如: N = 7 f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = ...

Scwabc_123的博客 2289

网易2017编程题之前n个数的最大奇约数之和

小易是一个数论爱好者,并且对于一个数奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.现在给出一个N,需要出 f(1) + f(2) + f(3)…….f(N)例如: N = 7f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 +

m0_37650263的博客 843

[HD2018.X1] 奇约数个数

如果一个数既是奇数又是约数,我们就称其为奇约数(提醒你,这里肯定不包括负数的情况啊)。仅一行,包含一个正整数 𝑛(1≤𝑛≤109)n(1≤n≤109)。现在给你一个正整数 𝑛n ,请你统计 𝑛n 有多少个奇约数。通过学习信息学,你肯定知道什么是奇数,什么是约数。仅一行,包含一个整数,表示 𝑛n 的奇约数个数

2301_80872740的博客 428

最大的奇约数

题目描述 小易是一个数论爱好者,并且对于一个数奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要出 f(1) + f(2) + f(3).......f(N) 例如: N = 7  f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 +

weixin_40207422的博客 538

N个数的最大公约数和最小公倍数

软工1804姚远原创 一、题目要 N个数的最大公约数和最小公倍数。用C或C++或java或python语言实现程序解决问题。 1.程序风格良好(使用自定义注释模板) 2.提供友好的输入输出,并进行输入数据的正确性验证。 二、算法分析 两数之积等于两数的最大公...

weixin_44746916的博客 391

输入两个正整数m和n,其最大公约数和最小公倍数

最大公约数方法

weixin_67508286的博客 8242

N是完全平方数 充分必要条件 N有奇数约数

N是完全平方数 N有奇数约数 设:N = n*n 充分性: 1、N=1时,N的约数1,为奇数 2、N>1时,1.....n......N,其中 1, n, N为N的3个约数。若在1~n之存在另外一个约数m1,则在n~N之必存在约数N/m1,同理,有m2,则存在N/m2,即必有 (3 + 偶数)个,为奇数 必要性: 1、如果N的约数只有两个,那只能是1和N本身,

白菜 3035

补充:约数个数定理

对于任一一个正整数N,根据质因数分解定理其都可拆分为若干素数相乘的形式,则该正整数N 的约数个数为各素因子幂次加一后再相乘。(证明:排列组合问题)如:72 = 2^3 + 3^2, 则72的约数个数为(3 + 1)*(2 +1)= 12。

2302_80193692的博客 625

网易面试题之小易是一个数论爱好者,并且对于一个数奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要

小易是一个数论爱好者,并且对于一个数奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。例如:f(44) = 11. 现在给出一个N,需要出 f(1) + f(2) + f(3).......f(N) 例如: N = 7 f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 +

李凯龙 2784

正整数n是几位数 c++_索引:正整数的性质 D

点击上方“蓝字”,发现更多精彩。正整数的性质 C7,D1完全平方数1. 证明:奇数的平方的十位数字必定是偶数.正整数的性质 D22. 如果完全平方数的十位数字是奇数,则它的个位数字一定是 6;反之,如果完全平方数的个位数字是 6,则它的十位数字一定是奇数.3. 设 n 是一个正整数,且 1×2×…×n+3 是一个完全平方数, n 的值.4. 设 x,y 是正整数,问:x2+2y 与 y...

weixin_32926649的博客 1243

【PHP】最大奇约数的和

小易是一个数论爱好者,并且对于一个数奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.现在给出一个N,需要出 f(1) + f(2) + f(3)…….f(N)例如: N = 7f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 +

杨森源的博客 1449

最大公约数(四种算法)

题目名称 最大公约数 题目要 运行最大公约数的常用算法,并进行程序的调式与测试,要程序设计风格良好,并添加异常处理模块(如输入非法等)。 算法设计 1.辗转相除法 辗转相除法(又名欧几里德法)C语言中用于计算两个正整数a,b的最大公约数和最小公倍数,实质它依赖于下面的定理: 其算法过程为: 前提:设两数为a,b设其中a 做被除数,b做除数,temp为余数 (1)、大数放a中、小数放b中; ...

清举的博客 4796
上一篇: 判断一个十进制正整数是不是2的幂
下一篇: python基础(一)——字符串操作
泳冠三军
博客等级 码龄16年 4粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值