CSDN-P次方数
来源:互联网 发布:中国人均消费支出数据 编辑:程序博客网 时间:2024/05/16 05:27
题目详情
一个整数N,|N| >= 2, 如果存在整数x,使得N = x * x * x... (p个x相乘) =x^p,则称N是p次方数,给定32位内的整数N,求最大的P。例如N=5,输出1,N=36则输出2。
答题说明
main函数可不用完成。
这题有两种解决方法
第一种就是分解质因数的变形,这种测试时大于3s,超时了
就是数太大是,循环次数太多...........需要优化循环!!!!
#include<stdio.h>#include<math.h>int comp(int n){int i;if(abs(n)<2 || n%2==0)return 0;if(n<0)n*=(-1);for(i=3;i<=sqrt(n); i+=2)if(n%i==0)return 0;return 1;}int give(int w){int m,i,k=0,flag=0;long long n=(long long )w,x;if(n<0){flag=1;n*=(-1);}m=sqrt(n);if(comp(n))return 1;for(i=2;i<n;i++){x=n;k=0;while(x%i==0){k++;x/=i;}if(x==1){if(flag && (k%2==0))return 1;else return k;}}return 1;}int main(){int n;while(scanf("%d",&n)!=EOF){printf("%d\n",give(n));}return 0;}
第二种方法就是大大减小循环的次数,就是依次开方根,依次比较是否满足要求,所以这次通过了.......
不过要注意两个问题,
1.输入的n可能是负数,负数只需开奇次方根
2.边界问题,-2147483648这个数很特殊,因为n=n*(-1),n还是-2147483648,
#include<stdio.h>#include<math.h>int give(int x){long long n=(long long)x;int count=1,num=0;double r=1.0/(double)(1<<20),t,d;int i;if(n>0){for(i=2;i<=32;i++){t=1.0/(double)i;d=pow(n,t);num=(int)(d+0.5);if(d<2)break;if(fabs(num-d)<=r){count=i;}}}else{n*=(-1);for(i=3;i<32;i+=2){t=1.0/(double)i;d=pow(n,t);num=(int)(d+0.5);if(fabs(d)<2){//printf("%d\n",abs(d));break;}if(fabs(num-d)<=r){count=i;}}}return count;}//start 提示:自动阅卷起始唯一标识,请勿删除或增加。int main(){ printf("%d\n",give(-2147483648));return 0;}//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
0 0
- CSDN-P次方数
- P次方数 英雄会 csdn 高校俱乐部
- P次方数-c#求解-英雄会在线编程题目
- P次方数-c#求解-英雄会在线编程题目
- p次方求和
- nyoj420 p次方求和
- acm-p次方求和
- NYOJ p次方求和
- 420 p次方求和
- NYOJ-p次方求和
- p次方求和
- p次方求和
- 1153 -- p次方求和
- p次方求和
- p次方求和
- NYOJ 420 p次方求和
- NYOJ-420:p次方求和
- NYOJ 420 p次方求和
- 广州传智播客0217Java基础班春游活动:汗洒剑涛体育馆
- DNS域名解析二方法
- 开始更博!
- android arraylist 研究共享
- 四层和七层负载均衡
- CSDN-P次方数
- build/envsetup.sh 学习
- queue单向队列
- 对话框/进度等待/进度条窗口 && MenuInflater && LayoutInflater && AppWidget
- “两高”报告表决结果引现场惊叹 最高法人员摇头
- java连接mysql数据库
- System.out.println(s) 打印值为对象引用时,调用toString()方法。
- 热烈庆祝河北深州加盟商成功加盟捷西橱柜
- 设置开机挂载