啥也别说了
看C++和算法,眼泪哗哗的。。。
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
algorithm(14)
(rss)
pku/acm(59)
(rss)
数字图像(1)
(rss)
随笔档案
2010年5月 (1)
2010年3月 (5)
2009年3月 (1)
2008年12月 (1)
2008年11月 (66)
搜索
最新评论
1. re: ACM 2325 Persistent Number 大数相除
大数相除部分,貌似100/20的结果是错的。
--Raise
2. re: 字典树原理(转)
一看就是c++外行写的代码,
--ddd
3. re: ACM 1664 放苹果
赞。。新手 看了豁然开朗。.。谢谢了
--mokuku
4. re: 字典树原理(转)
代码风格不是很好
--ygqwna
5. re: 字典树原理(转)[未登录]
只有new,没有delete,必然内存泄露
--123
阅读排行榜
1. 字典树原理(转)(7979)
2. STL 堆排序使用和体会(转)(2072)
3. ACM 2325 Persistent Number 大数相除(1758)
4. 二叉树实例(1725)
5. 大概了解cin,cin.getline,cin.clear,cin.ignore,cin.get()的用法(1612)
评论排行榜
1. 字典树原理(转)(7)
2. ACM 1730 Perfect Pth Powers(3)
3. ACM 1929 Calories from Fat(2)
4. ACM 2316 SPIN(2)
5. ACM 2325 Persistent Number 大数相除(2)
Powered by:
博客园
模板提供:
沪江博客
C++博客
|
首页
|
发新随笔
|
发新文章
|
联系
|
聚合
|
管理
ACM 1730 Perfect Pth Powers
#include
<
iostream
>
#include
<
math.h
>
using
namespace
std;
int
main()
{
long
long
mm,i,n;
double
m,p;
while
(
1
)
{
scanf(
"
%I64d
"
,
&
n);
if
(
!
n)
break
;
if
(n
>
0
)
{
i
=
(
long
long
)(log((
double
)n)
/
log(
2.0000000
))
+
1
;
for
(;i
>
1
;
--
i)
{
m
=
pow((
double
)n,
1.0000000
/
(
double
)i);
mm
=
(
long
long
)m;
if
(m
-
(
double
)mm
<
1e
-
12
||
(
double
)mm
+
1
-
m
<
1e
-
12
)
{
printf(
"
%I64d\n
"
,i);
break
;
}
}
if
(i
==
1
)
printf(
"
1\n
"
);
}
else
{
n
=-
n;
i
=
(
long
long
)(log((
double
)n)
/
log(
2.0000000
))
+
1
;
if
(i
%
2
==
0
)
--
i;
for
(;i
>
1
;i
-=
2
)
{
m
=
pow((
double
)n,
1.0000000
/
(
double
)i);
mm
=
(
long
long
)m;
if
(m
-
(
double
)mm
<
1e
-
12
||
(
double
)mm
+
1
-
m
<
1e
-
12
)
{
printf(
"
%I64d\n
"
,i);
break
;
}
}
if
(i
==
1
)
printf(
"
1\n
"
);
}
}
return
0
;
}
直接枚举。
貌似pow()函数比log()快。之前用log()函数枚举对数的底,超时。
对输入要分正负。枚举的范围是[1,log((double)n)/log(2.0000000)+1]。
当x为正数时,p取以上区间所有整数,在符合的p中取最大。
当x为负数时,将x转化为正数处理,p取以上区间所有奇数(因为只有奇数次幂才可能等于负数),
在符合的p中取最大。
发表于 2008-11-17 22:54
hunter
阅读(506)
评论(3)
编辑
收藏
引用
所属分类:
pku/acm
评论
#
re: ACM 1730 Perfect Pth Powers
回复
更多评论
哈哈,一群笨蛋,原始方法是你们想的吗?
不懂创新,中国的未来堪忧啊
#
re: ACM 1730 Perfect Pth Powers
回复
更多评论
看我的代码,虽然很乱,方法笨蛋,但是这是我花几个小时自己想的的
/*
* File: main.cpp
* Author: Administrator
*
* Created on 2011年6月5日, 下午1:15
*/
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
/*
*
*/
int main(int argc, char** argv) {
long long n;
while (cin >> n) {
int flag[1000] = {0};
if (n == 0)
break;
else if (n < 0) {
n = -n;
long long k = n;
int count = 0;
int p = 1;
for (int i = 2; (i <= sqrt(k) + 1) && (i < k); i++) {
while (k % i == 0) {
flag[count]++;
k = k / i;
}
if (k != n) {
count++;
}
}
if (k != 1) {
cout << p << endl;
} else {
if (count == 1 || count == 0) {
while (flag[0] % 2 == 0) {
flag[0] = flag[0] / 2;
}
cout << flag[0] << endl;
} else {
for (p = flag[0];; p--) {
if (p % 2 == 0) {
p--;
}
int m = 0;
while (flag[m] % p == 0 && m < count) {
m++;
}
if (m == count) {
cout << p << endl;
break;
}
}
}
}
}
else if (n > 0) {
long k = n;
int count = 0;
int p = 1;
for (int i = 2; (i <= sqrt(k) + 1) && (i < k); i++) {
while (k % i == 0) {
flag[count]++;
k = k / i;
}
if (k != n) {
count++;
}
}
if (k != 1) {
cout << p << endl;
} else {
if (count == 1 || count == 0) {
cout << flag[0] << endl;
} else {
for (p = flag[0];; p--) {
int m = 0;
while (flag[m] % p == 0 && m < count) {
m++;
}
if (m == count) {
cout << p << endl;
break;
}
}
}
}
}
}
return 0;
}
#
re: ACM 1730 Perfect Pth Powers
回复
更多评论
QQ 354615286
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
ACM 2402 Palindrome Numers
ACM 2325 Persistent Number 大数相除
ACM 2316 SPIN
ACM 2299 Ultra QuickSort 合并排序的应用
ACM 2291 Rotten Ropes
ACM 2275 Flipping Pancake reverse()函数的应用
ACM 2273 An Excel-lent Problem
ACM 2183 Bovine Math Geniuses
ACM 2141 Message Decowding
ACM 2140 Herd Sums
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理