首页 > 试题广场 >

数列计算

[编程题]数列计算
  • 热度指数:1644 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
已知一个正整数n,(3 <= n <= 15),将所有n的乘方幂以及所有n的乘方幂(有限个且互不相等)之和组成一个递增序列。例如,当n为4时,该序列为:
1, 4, 5, 16, 17, 20, 21……
(4^0, 4^1, 4^0+4^1, 4^2, 4^0+4^2, 4^1+4^2, 4^0+4^1+4^2……)
请求出该序列的第K项(10进制)。

输入描述:
输入只有1行,为2个正整数,两数之间用一个空格隔开:
n K
(n, K的含义与上述描述一致, 且3<=n<=15, 10<=K<=1000)。


输出描述:
输出为计算结果,为一个正整数(注意在所有测试数据中,结果均不会超过2.1*10^9)。整数前不要有空格或其他任何符号。
示例1

输入

3 100

输出

981
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int c = 0;
        int i = 0;
        int[] arr = new int[k];
        while(c<k){
            int tmp = (int) Math.pow(n,i++);
            arr[c++] = tmp;
            int len = c;
            for(int j=0;j< len-1 ;j++){
                 if(c>=k){
                    break;
                }
                arr[c++] = tmp + arr[j];
            }
        }
        Arrays.sort(arr);
        System.out.println(arr[k-1]);
    } 
}

发表于 2022-04-19 21:19:30 回复(0)
/*
思路:将k变成二进制后,对应位上为1则表明n的次数
例如: n = 4, k = 5
由于 5 的二进制数为 101
那么对应的数
n^0 + n^2
k = 6 --- 110
n^1 + n^2
*/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str = br.readLine().split(" ");
        int n = Integer.parseInt(str[0]);
        int k = Integer.parseInt(str[1]);
        String bin = Integer.toBinaryString(k);
        int sum = 0;
        for(int i = bin.length()-1,j = 0;i>=0;i--){
            int temp = (bin.charAt(i) == '1')?1:0;
            sum = sum + temp*(int)Math.pow(n,j++);
        }
        System.out.println(sum);
        
    }
}

发表于 2020-05-21 15:32:16 回复(0)
Java解法
import java.util.Scanner;

public class Main {

 //就是将k转成2进制,比如k=6,n=4,k的2进制为110,然后以n进制输出来。即1*4^2+1*4^1+0*4^0
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //进制基数
        int n = scanner.nextInt();
        //第k个数
        int k = scanner.nextInt();
        //转化为二进制字符串
        String s = Integer.toBinaryString(k);
        int sum=0;
        for (int i = 0,len=s.length(); i <len; i++) {
            int bit=s.charAt(i)=='1'?1:0;
            sum+=bit*Math.pow(n,len-i-1);
        }
        System.out.println(sum);
    }
}


发表于 2020-03-01 10:02:04 回复(0)