算法-数列构造问题(java实现)

数列构造问题概述

        给定一个正整数k(3<=k<=15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,请你求出这个序列的第N项的值(用十进制数表示)。

举例如下:

     k=3时, 序列按十进制排列为:

             1349101213  …

    序列各元素的表达式为:

3^03^13^0+3^13^23^0+3^23^1+3^23^0+3^1+3^2 …

   k=3N=100,正确答案应该是?

算法概述:

        利用除基取余法,将所求序列某项的序号N(十进制数)转换为a1a2am(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;
	 } 	
}

运行效果如下:

转载于:https://my.oschina.net/flyyourdream/blog/866602

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值