链接:https://ac.nowcoder.com/acm/contest/3007/E
来源:牛客网
立方数
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld题目描述
对于给定的正整数 N,求最大的正整数 A,使得存在正整数 B,满足 A3B=N
输入包含 T 组数据,1≤T≤10,000;1≤N≤1018
输入描述:
第一行数字 T 表示数据组数
接下来一行,T 个正整数 N
输出描述:
T 行,每行一个数字表示答案
示例1
输入
复制4 27 24 7 54
4 27 24 7 54
输出
复制3 2 1 3
3 2 1 3
记得cbrt(n)+0.5 四舍五入 !!!
“牛顿迭代法快速寻找平方根”文章
求出根号a的近似值:首先随便猜一个近似值x,然后不断令x等于x和a/x的平均数,迭代个六七次后x的值就已经相当精确了。
例如,我想求根号2等于多少。假如我猜测的结果为4,虽然错的离谱,但你可以看到使用牛顿迭代法后这个值很快就趋近于根号2了:
( 4 + 2/4 ) / 2 = 2.25
( 2.25 + 2/2.25 ) / 2 = 1.56944..
( 1.56944..+ 2/1.56944..) / 2 = 1.42189..
( 1.42189..+ 2/1.42189..) / 2 = 1.41423..
....
这种算法的原理很简单,我们仅仅是不断用(x,f(x))的切线来逼近方程x^2-a=0的根。根号a实际上就是x^2-a=0的一个正实根,这个函数的导数是2x。也就是说,函数上任一点(x,f(x))处的切线斜率是2x。那么,x-f(x)/(2x)就是一个比x更接近的近似值。代入 f(x)=x^2-a得到x-(x^2-a)/(2x),也就是(x+a/x)/2。
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=31700; bool mark[N]; int prim[N]; ll Prim[N]; int cnt; void initial() { cnt=0; for (int i=2 ; i<N ; ++i) { if (!mark[i]) { Prim[cnt]=1ll*i*i*i; prim[cnt++]=i; } for (int j=0 ; j<cnt && i*prim[j]<N ; ++j) { mark[i*prim[j]]=1; if (!(i%prim[j])) break; } } } ll f(ll a) { return a*a*a; } int main() { initial(); int T; scanf("%d",&T); while(T--) { ll ans=1; ll n; scanf("%lld",&n); map <int,int> mp; for(int i=0;i<cnt;i++) { while(n%(Prim[i])==0) { ans*=prim[i]; n/=Prim[i]; if(n==1||n==0) break; } while(n%prim[i]==0) { n/=prim[i]; if(n==1||n==0) break; } if(n==1||n==0) break; } ll nn=cbrt(n)+0.5; if(nn*nn*nn==n ) ans*=nn; printf("%lld\n",ans); } }
立方数 唯一分解 开方四舍五入
最新推荐文章于 2023-10-19 15:55:24 发布