第一次写,使用math.h中的pow函数时间超限
#include<iostream>
#include<math.h>
using namespace std;
int is_nar(int n, int k)
{
int a = n, b, num, sum = 0;
while(a)
{
b = a%10;
a = a/10;
num = pow(b, k);
sum = sum + num;
}
if(sum == n) return 1;
else return 0;
}
int main()
{
int n;
cin >> n;
int a = pow(10, n-1), b = pow(10, n);
for(int i = a; i < b; i++)
{
int ret = is_nar(i, n);
if(ret) cout << i << endl;
}
}
第二次,手写的pow_函数,正确了
#include<iostream>
#include<math.h>
using namespace std;
int pow_(int a, int b)
{
int sum = 1;
for(int i = 1; i <= b; i++)
{
sum *= a;
}
return sum;
}
int is_nar(int n, int k)
{
int a = n, b, num, sum = 0;
while(a)
{
b = a%10;
a = a/10;
num = pow_(b, k);
sum = sum + num;
}
if(sum == n) return 1;
else return 0;
}
int main()
{
int n;
cin >> n;
int a = pow_(10, n-1), b = pow_(10, n);
for(int i = a; i < b; i++)
{
int ret = is_nar(i, n);
if(ret) cout << i << endl;
}
}
是因为pow函数参数为double, 源码复杂一些,题中求的是整数,手动写的会比源码简单,时间不超限。
pow()源码
double my_pow(double x, double y)
{
register double ret, value;
double r = 1.0;
long p = (long) y;
if (x == 0.0 && y > 0.0)
return 0.0;
if (y == (double) p)
{
if (p == 0)
return 1.0;
if (p < 0)
{
p = -p;
x = 1.0 / x;
}
while (1)
{
if (p & 1)
r *= x;
p >>= 1;
if (p == 0)
return r;
x *= x;
}
}
__asm__(
"fmul %%st(1);"
"fst %%st(1);"
"frndint;/n/t"
"fxch;/n/t"
"fsub %%st(1);/n/t"
"f2xm1;/n/t"
: "=t" (ret), "=u" (value)
: "0" (log2 (x)), "1" (y)
);
ret += 1.0;
__asm__(
"fscale"
: "=t" (ret)
: "0" (ret), "u" (value)
);
return ret;
}
这篇博客讲述了作者在解决水仙花数问题时遇到的时间超限问题。最初使用math.h库中的pow函数,但因pow函数处理double类型导致效率低下。为了解决这个问题,作者手动编写了一个简单的pow_函数,专门针对整数运算,从而成功避免了时间超限的问题。
9105

被折叠的 条评论
为什么被折叠?



