k的幂次 题解(今日题解第二弹)
Time Limit: 1000ms
Memory Limit: 32768kB
题目描述
k的幂数量
输入格式
三个整数 l,r,k
输出格式
[l,r]之间k的所有幂
样例
Input 1
1 10 2
Output 1
1 2 4 8
Input 2
237171123124584251 923523399718980912 7150
Output 2
-1
数据范围
1<=l<=r<=1018,2<=k<=109
解释:k的幂次就是数字k的几次方。
样例解释
样例一:
2 ^ 0(1) , 2 ^ 1(2) , 2 ^ 2 (4) , 2 ^ 3(8) 在1~10之间,所以输出“1 2 4 8”。
样例二:
7150的每个幂次都不在范围内,故输出“-1”;
此题看似不难,实则处处陷阱!!! 
思路讲解:
首先从零开始循环,保证 k ^ i 小于右边界r。
如果 k ^ i 小于左边界l,那么跳出本层循环。
如果在范围内,也就是这个数大于等于左边界l,小于等于右边界r,输出这个数。
你肯定在想,真是太简单了!!NO NO NO!!!都说了有陷阱!!
如果你用pow老老实实输出,你就会开心的拿到这个“完美”的分数:
真是太完美了!!! 
因为pow会精度丢失,欸嘿~
我们中国有一句古话,叫做与其坐以待毙,不如自写函数!!
函数还是非常简单滴,循环i次,*=k就行了。
对了,还要写一个flag,如果已经输出了一个数了,值就变为1。
最后——
只要判断一下flag为不为0(判断是否输出过)如果flag还是等于0(未输出过一次),输出“-1”.
附上伪代码(大家最想康的环节)
#include<bits/stdc++.h>
using namespace std;
#define int long long
int l,r,k,sum;
int k2(int x,int y){
//循环i次,*=k就行了
//返回 k的i次方;
}//自制pow函数(不丢失精度的)
signed main(){
//输入
int j=k;
int flag=0;
for(int i=0;pow(k,i)<=r;i++){
if(/* pow( k , i) 小于左边界l*/){
//跳出本层循环;
}
//输出
//flag记录;
}
if(/*未输出过一次*/){
//输出-1;
return 0;
}
}
呼~不容易啊,有疑问还是私聊我哈!!
