趁热打铁!!!《k的幂次》题解,启动!!

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”;

此题看似不难,实则处处陷阱!!! :dizzy_face:

思路讲解:

首先从零开始循环,保证 k ^ i 小于右边界r。

如果 k ^ i 小于左边界l,那么跳出本层循环。

如果在范围内,也就是这个数大于等于左边界l,小于等于右边界r,输出这个数。

你肯定在想,真是太简单了!!NO NO NO!!!都说了有陷阱!!

如果你用pow老老实实输出,你就会开心的拿到这个“完美”的分数:

真是太完美了!!! :sob:

因为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;
	}
}

呼~不容易啊,有疑问还是私聊我哈!!

7 个赞

okok

1 个赞

弗如快速幂

1 个赞