HDU 6182 A Math Problem 水题+签到题

题意:

给你一个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;
}

猜你喜欢

转载自blog.csdn.net/shensiback/article/details/80089153
今日推荐