cug1181
2015-07-16 23:42
253 查看
题目大意:题意:求使得x = b^p的最大的p
•思路一:数据范围是32位,直接从31开始倒叙枚举所有的p,满足题意则输出即可。至于如何判断x
= b^p,可以先对x开p次方取整后得到一个数,在对该数取n次方,判断是否等于x,若相等即满足。(注意x可能为负数,此时p只能是奇数)
•思路二:对x进行素数分解,则所有素因子的指数的最大公约数即为所求。给出的x可以是负数……负数的情况要先把x变成-x去计算,显然只有奇数次乘方才有可能是负数(我们不考虑复数……),所以如果最后结果是偶数,要不断将结果减半,直到为奇数。
•思路一:数据范围是32位,直接从31开始倒叙枚举所有的p,满足题意则输出即可。至于如何判断x
= b^p,可以先对x开p次方取整后得到一个数,在对该数取n次方,判断是否等于x,若相等即满足。(注意x可能为负数,此时p只能是奇数)
•思路二:对x进行素数分解,则所有素因子的指数的最大公约数即为所求。给出的x可以是负数……负数的情况要先把x变成-x去计算,显然只有奇数次乘方才有可能是负数(我们不考虑复数……),所以如果最后结果是偶数,要不断将结果减半,直到为奇数。
#include<iostream> #include<string> #include<cstring> #include<cmath> using namespace std; int main() { int n; while(cin >> n && n) { if(n > 0) { for(int i = 31 ; i >= 1 ; i -- ) { int a = (pow(n * 1.0, 1.0/ (i*1.0)) + 0.5) ; int b = (pow(a * 1.0, (i*1.0)) + 0.5); if(b == n) { cout << i << endl; break; } } } else { n = -n; for(int i = 31 ; i >= 1 ; i -= 2 ) { int a = (pow(n * 1.0, 1.0/ (i*1.0)) + 0.5) ; int b = (pow(a * 1.0, (i*1.0)) + 0.5); if(b == n) { cout << i << endl; break; } } } } return 0; }
相关文章推荐
- 约瑟夫环问题的公式推导
- _beginthreadex()与CreateThread()函数的区别
- nodejs+socket.io聊天室
- linux xmlrpc 服务端 java客户端
- Java基础---IO流
- centos6.5 gcc 库升级
- ZABBIX企业监控实践(1):ZABBIX详细部署过程 推荐
- android--轻量级缓存框架ASimpleCache分析
- [codeigniter 三]、例子——“Hello World!”
- 基于cocos2dx的飞机大战学习[四]-添加英雄子弹
- 【Android4高级编程笔记】深入探讨Android Activity
- dup和dup2函数
- Leetcode: Power of Two
- Java中如何编解码
- UAC
- openSession()与getCurrentSession()区别
- Unique Binary Search Trees
- 040.Two Array 二维数组
- C语言 数组和字符串篇
- 纪念开通博客的第一天