【幂数列】设x,y为非负整数,试计算集合M={2^x*3^y|x>=0,y>=0}的元素小于指定整数n的个数, 并求这些元素从小到大序列的第m项。

来源:互联网 发布:东风41导弹数据 编辑:程序博客网 时间:2024/04/28 00:10
/*
 * 【幂数列】
 * 设x,y为非负整数,试计算集合M={2^x*3^y|x>=0,y>=0}的元素小于指定整数n的个数,
 * 并求这些元素从小到大序列的第m项。
 */
package test1;


import java.util.Scanner;


public class demo {
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
int i,j,k,h,u,m;
int c[]=new int[100];
double d,n,t;
double f[]=new double[1000];
System.out.print("计算小于n的项数,请指定:");
n=in.nextDouble();
System.out.print("输出序列的第m项,请指定m:");
m=in.nextInt();
k=1;
t=1.0;
i=1;
c[0]=1;
f[1]=1.0;
while(true)
{
u=0;         //是否继续递推的标志,为1,表示继续;为0,表示退出。
for(j=0;j<=i-1;j++)
{
h=c[i-1]+j;     //h代表第i行第j个元素在f[]数组中的索引
if(f[h]*2<n && f[h]>0)
{
k++;
f[k]=f[h]*2;
u=1;
if(j==0)
c[i]=k;
}
else break;
}
t=t*3;
if(t<n && t>0)
{
k++;
f[k]=t;
}
if(u==0)
break;
i++;
}
for(i=1;i<k;i++)        //冒泡排序
for(j=1;j<k-1;j++)
if(f[j-1]>f[j])
{
d=f[j];
f[j]=f[j-1];
f[j-1]=d;
}
System.out.printf("幂序列中小于%f的项数为:%d\n",n,k);
if(m<k)
System.out.printf("从小到大排列的第%d项为:%.0f",m,f[m]);
else
System.out.println("所输入的m大于序列的项数!");
}
}
0 0
原创粉丝点击