数学问题 时间限制:2000/1000 MS(Java / Others)内存限制:32768/32768 K(Java / Others) 总提交:1321接受提交:476
问题描述 给定一个正整数n,请计算k个满足多少正整数 ķ^k≤ N。
输入 没有超过50个测试用例。
每种情况只包含一行中的积分整数n。
1 ≤ N ≤ 1e18
产量 对于每个测试用例,输出整数表示正整数k满足的数量 k^k≤ N 在一条线上。
样品输入 1 4
样品输出 1 2
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main() {
// 正整数
long long n;
int k = 1, sum = 0;
while (scanf("%I64d", &n) != EOF && n >= 1 && n <= 1e18)
{
while (k <= n)
{
if (pow(k, k) <= n)
{
sum++;
k++;
}
else {
break;
}
}
printf("%d\n", sum);
sum = 0;
k = 1;
}
return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
long long a[20];
void deal()
{
for (int i = 1; i <= 15; i++) // 计算k的k次方
{
long long result = 1;
for (int j = 1; j <= i; j++)
{
result *= i;
}
a[i] = result;
}
a[16] = (long long)1e18 * 9; // 界限是1e18
}
int main()
{
deal();
long long n;
while (cin >> n)
{
for (int i = 1; i <= 16; i++)
{
if (a[i] > n)
{
cout << i - 1 << endl;
break;
}
}
}
}
a[16] = (long long)1e18 + 1; // 界限是1e18
pow()函数返回的是double类型的数,使用pow()函数打印15的15次方你会发现:
再拿计算器计算
两个结果不一样,对比下面两张图你就会发现
当数字大到15^15时两个计算的结果就不同,所以这就导致了第一种方法出现错误答案的原因!