zoukankan      html  css  js  c++  java
  • 立方

    问题描述

    今年乐乐开始学编程了,上几天刚刚解决了一个平方数的问题,问题是这样的:随便告诉你一个不超过 1 个亿的正整数,请你算出不超过该数的所有立方数的个数。 
    但是,如果这个超过 1 亿,是一个 18 位正整数,或 28 位的正整数呢? 
    乐乐不会算,你会吗?

    输入格式

    只有一行且只有一个正整数:n

    输出格式

    只有一行且只有一个正整数:不超过 n 的平方数个数

    样例输入

    100

    样例输出

    4

    提示

    1*1*1 = 1   2*2*2 = 8 
    3*3*3 = 27  4*4*4 = 64 
    5*5*5 = 125  但是 125 > 100 

    数据范围

    对于30%的数据,1≤n≤108 
    对于70%的数据,1≤n≤1018  
    对于100%的数据,1≤n≤1028  

    题解

    最暴力的算法是直接从1枚举到n,验证每一个数是不是立方数

    事实上,越大的数,相邻两个立方数的差越大,所以n越大就会浪费越多的时间

    而计算机1秒能运行的次数最多不超过1亿次,n的最大值有28位数,一个一个数枚举会超时超的很严重

    换一个思路,我们可以通过枚举立方数的立方根直接找到立方数

    从1开始,每一个数都对应着唯一一个立方数

    即,1对应的立方数是1,2对应的立方数是8,3对应的立方数是27,4对应的立方数是64,……

    所以我们可以通过枚举1,2,3,4,…… 直接找到对应的立方数1,8,27,64,……

    这样我们就可以省掉验证2,3,4,……,7,9,10,……26,28,29,……,63,65,……是不是立方数的时间。显然,n越大省的时间越多

    我们知道最大的立方数不会超过n,所以我们只要枚举到n的立方根就可以了,这样比最开始的一个数一个数枚举省了很多时间

    但是别忘了计算机1秒能运行的次数最多不超过1亿次,而一个28位数开立方也有9位数,还是会超过1亿次

    观察上述算法,我们发现,从1到n的立方根的每一个数都对应一个立方数,所以,不超过n的立方数的个数其实就是n的立方根(下取整)

    介绍一下C++自带的求立方根的函数cbrt(),在<cmath>的头文件里(C语言好像没有?)或者直接万能头文件<bits/stdc++.h>

    还有一个要注意的是C和C++最大的整型long long最大值也只有18位数,所以要用double存n

    然后代码并不是很长。。。。

     1 #include <cstdio>
     2 #include <cmath>
     3 #define ll long long
     4 double n;
     5 int main()
     6 {
     7     scanf("%lf",&n);
     8     ll x=cbrt(n);
     9     printf("%lld
    ",x);
    10     return 0;
    11 }
  • 相关阅读:
    [转载]Python量化交易平台开发教程系列1-类CTP交易API的工作原理
    [转载]Python量化交易平台开发教程系列0-引言
    Wind量化平台使用点评
    掘金量化使用点评
    Tushare使用点评
    量化交易的Python工具链
    可见光通信与室内定位技术
    Qt5下实现摄像头预览及捕获图像方法二(openCV3与Qt5交互使用)
    ubuntu下软件包安装故障解决方案(深入剖析专治疑难)
    Qt5下实现摄像头预览及捕获图像方法一
  • 原文地址:https://www.cnblogs.com/rabbit1103/p/14778907.html
Copyright © 2011-2022 走看看