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
原创粉丝点击