HDU 6182 A Math Problem 水题+签到题

本文介绍了一种计算满足k^k≤n条件的正整数k的数量的方法。通过预先计算1到15之间的所有k值的k次幂,并存储在一个数组中,然后比较给定的n值来确定符合条件的k的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给你一个n[1,10^18],问你有多少个正整数k满足,k^k <= n;

分析:

用计算器算了一下,15的15次方是18位,16的16次肯定就超出19位了。
so打表---k[1,15]的k次方;然后判断n大于几个;
用了一个小技巧,打表从1开始存,这样的话遍历一遍,数组的下表就是满足的个数!~~
不打表的话---
这个题可以用来锻炼一个算法——————**快速幂**---在这里就不详细解释了^_^
这个题我有一个问题,一开始我使用了c++自带的求k的k次方,就是过不了,代码在最下面
但是手写一个求k的k次方就过了。。有知道的可以留言下下-----O(∩_∩)O谢谢

代码:

正确代码:
#include <cstring>
#include <iostream>
#include <algorithm>
#include <math.h>
#define maxn 55
#define ll long long int
using namespace std;
ll num[16];
void init(){
    for(int i = 1; i < 16 ;i++){
        num[i] = 1;
        int k = i;
        for(int j = 0; j < i;j++){
            num[i] *= k;
        }

    }
}
int main(){
    ll n;
    init();
    while(cin>>n){
        int i = 1;
        for(i;i < 16;i++){
            if(n < num[i]){
                break;
            }
        }
        cout<<--i<<endl;
    }
    return 0;
}
错误代码:

欢迎帮忙指正~~~

#include <cstring>
#include <iostream>
#include <algorithm>
#include <math.h>
#define maxn 55
#define ll long long int
using namespace std;
ll num[16];
void init(){
    for(int i = 1; i < 16 ;i++){
        num[i] = (ll)pow(i,i);
    }
}
int main(){
    ll n;
    init();
    while(cin>>n){
        int i = 1;
        for(i;i < 16;i++){
            if(n < num[i]){
                break;
            }
        }
        cout<<--i<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值