数列构造问题概述
给定一个正整数k(3<=k<=15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,请你求出这个序列的第N项的值(用十进制数表示)。
举例如下:
当k=3时, 序列按十进制排列为:
1,3,4,9,10,12,13 …
序列各元素的表达式为:
3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2 …
当k=3,N=100,正确答案应该是?
算法概述:
利用除基取余法,将所求序列某项的序号N(十进制数)转换为a1a2…am(a为二进制数,1,2...m为下标)
进而求出序列第N项值(十进制数)。
(b为底数)
java实现算法的桌面程序:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Font;
public class CreateArray extends JFrame{
private JLabel inputBase =new JLabel("请输入底数",SwingConstants.CENTER);
private JTextField ib=new JTextField();
private JLabel inputSequence=new JLabel("获取前N项",SwingConstants.CENTER);
private JTextField is=new JTextField();
private JButton jbtJisuan=new JButton("输出数列");
JLabel label0=new JLabel("输出结果为:");
JLabel excuteTimeLabel=new JLabel("运行时间为:");
private JLabel[] labelOutput=new JLabel[100000];
JPanel showResult;
public CreateArray(){
Font font=new Font("宋体",Font.BOLD,16);
Font font1=new Font("宋体",Font.BOLD,14);
label0.setFont(font);
inputBase.setFont(font1);
inputSequence.setFont(font1);
jbtJisuan.setFont(font1);
excuteTimeLabel.setFont(font1);
JPanel input=new JPanel();
input.setLayout(new GridLayout(3,5));
input.add(inputBase);
input.add(ib);
input.add(inputSequence);
input.add(is);
input.add(jbtJisuan);
input.add(excuteTimeLabel);
showResult=new JPanel();
showResult.setLayout(new GridLayout(0,1));
showResult.add(label0,BorderLayout.NORTH);
ActionListener listener=new outputListener();
jbtJisuan.addActionListener(listener);
JScrollPane scrollPane=new JScrollPane(showResult);
scrollPane.setPreferredSize(new Dimension(300,300));
add(input,BorderLayout.NORTH);
add(scrollPane,BorderLayout.CENTER);
}
class outputListener implements ActionListener{
public void actionPerformed(ActionEvent e){
long startTime=System.nanoTime();//获取开始时间(纳秒)
long startTime1=System.currentTimeMillis();//获取开始时间(微秒)
int k=Integer.parseInt(ib.getText());
int N=Integer.parseInt(is.getText());
int num=30;
StringBuilder builder = new StringBuilder(); //num个空格
for(int i=0;i<num;i++){
builder.append(" ");
}
String str = builder.toString();
for(int i=1;i<=N;i++){
if(i<10){
labelOutput[i-1]=new JLabel(str+"第 "+i+" 项值为:"+FindNth(k,i));
}
else if(i<100){
labelOutput[i-1]=new JLabel(str+"第 "+i+" 项值为:"+FindNth(k,i));
}
else
labelOutput[i-1]=new JLabel(str+"第"+i+" 项值为:"+FindNth(k,i));
showResult.add(labelOutput[i-1],BorderLayout.NORTH);
}
long endTime1=System.currentTimeMillis();//获取开始时间(微秒) ;
long endTime=System.nanoTime();//获取结束时间(纳秒)
excuteTimeLabel.setText("程序运行时间为:"+(endTime-startTime)+" ns(纳秒)"+" "+(endTime1-startTime1)+" μs(微秒)");
}
}
public static void main(String[] args){
CreateArray Frame=new CreateArray();
Frame.pack();
Frame.setLocationRelativeTo(null);
Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Frame.setVisible(true);
Frame.setTitle("CreateArray");
long endTime=System.nanoTime();//获取结束时间(纳秒)
}
public String FindNth(int k,int N){
String out="";
int[] binary=new int[64];
for(int i=0;i<binary.length;i++){
if(N>0){
binary[i]=N%2;
}
N=N/2;
}
long sum=0;
for(int i=0;i<binary.length;i++){
sum+=(Math.pow(k,i))*binary[i];
if((Math.pow(k,i))*binary[i]!=0){
out+=k+"^("+i+")+";
}
}
out=out.substring(0,out.length()-1);//截取字串
return sum+" 表达式为:"+out;
}
}
运行效果如下: