/**该文件包含所有类;它不能像这样编译-它*需要划分为单个文件,每个类一个。*使用该程序的最佳方法是安装一个免费的IDE,如Netbeans。*/包装a166133;导入java.io.*;导入java.math。大整数;/***@作者jmason****主要等级为A166133。*它只调用Runner和您想要生成序列的数字。*例如1000万。Runner打开输出文件,对前三个条目1、2、4和*然后对主要算法进行迭代。该算法包括计算(最后一项)^2-1,然后找到最小值*序列中尚未包含因子。求最小因子首先要生成素因子,然后*然后是所有因素,无论是基本因素还是综合因素。然后对它们进行排序。因此,您会发现懒惰的程序员和优秀程序员之间的区别。这个*懒惰的程序员编写自己的低效排序算法。好人花钱*是时候学习如何使用java库提供的实用程序排序类了。*猜猜我是哪种类型?为了发现除数是否已经在序列中,我使用了Array类。这使用*一个巨大的布尔数组用于“小”值,一个哈希表用于较大的值。*/公共类A166133{公共静态void main(String[]args)引发IOException{//100万人23分钟新流道(100);//在这里写下你想要的字数}}包装a166133;导入java.math。大整数;导入java.util。数组列表;导入java.io.*;/***@作者jmason*/公共级跑步者{数组a;//PrimeList pl;public Runner(int循环)抛出IOException{int行=1;//pl=新PrimeList();//忽略这个失败的性能改进//打开的文件FileWriter fw=新的文件编写器(“out.txt”);//A166133号文件写入器fw2=新文件写入器(“min.txt”);//A256405型文件写入器fw3=新文件写入器(“pos.txt”);//A256409型FileWriter fw4=新的文件编写器(“hit.txt”);//A256406型//类数组是我们知道数字是否已经在A166133中的位置a=新阵列(fw3);//根据序列定义写出前3行a.put(1,1);fw.write(“1 1\r\n”);fw2.write(“1 2\r\n”);a.put(2,2);fw.write(“2 2\r\n”);fw2.write(“23\r\n”);a.put(3,4);fw.write(“3 4\r\n”);fw2.write(“3 3\r\n”);BigInteger值=新的BigIntiger(“4”);//生成序列的其余部分for(int i=4;i<=循环;i++){BigInteger prev=新的BigIntiger(value.toString());BigInteger bi=value.mpliply(value);bi=bi.subtrate(BigInteger.ONE);//bi现在相等(前^2)-1//查找下一个值value=新值(i,bi);//如果下一个值是“maximal”,即(前面的^2)-1//然后写出A256406if(value.compareTo(bi)==0)fw4.write(行+++“”+上一行+“\r\n”);//将值放入数组a.put(i,价值);//不时地向控制台写入如果(i%1000==0)System.out.println(i+“”+value+“”+a.min);//写入A166133fw.write(i+“”+值+“\r\n”);//写入A256405fw2.write(i+“”+a.min+“\r\n”);//序列死了吗?(可能不会)if(value.compareTo(BigInteger.ZERO)==0)断裂;}fw.关闭();fw2.关闭();fw3.关闭();fw4.关闭();}// 1, 2, 4, 3, 8, 7, 6, 5, 12, 11, 10, 9, 16, 15, 14, 13, 21, 20, 19, 18, 17, 24, 23, 22, 69, 28, 27//产生新价值private BigInteger newValue(int n,BigIntiger v){//获取所有因子的排序列表,不包括1,包括数字本身ArrayList列表=新的FactorList(/*pl*/).get(n,v);//查找数组中尚未出现的最小因子for(int i=0;i<list.size();i++){BigInteger bi=(BigIntiger)(list.get(i));if(a.test(bi))继续;返回bi;}return BigInteger。归零;}}/*此类维护已按顺序排列的所有值的数组。为了提高速度,它使用了一个布尔数组来表示达到一定大小的值;之后那是一个散列表*/包装a166133;导入java.math。大整数;导入java.util。哈希表;导入java.io.*;/***@作者jmason*/公共类数组{布尔数组[];int大小=500000000;//在此下方,使用布尔数组BigInteger bsize;哈希表h;public BigInteger最小值;//这是序列中尚未出现的最小数量整数行;文件写入器fw;公共阵列(FileWriter fw){this.fw=fw;array=新布尔值[size];bsize=新的BigInteger(“”+大小);h=新哈希表();min=新的BigInteger(“1”);}//在数组中设置一个数字已插入序列public void put(int n,BigInteger v)引发IOException{//如果是一个大数字,请使用散列if(v.compareTo(bsize)>=0){h.put(v.toString(),v);}else//否则为布尔数组{int i=整数.parseInt(v.toString());数组[i]=true;}//如果最后将最小值插入序列,//计算新序列,并写入A256405if(v.compareTo(最小)==0){线路++;fw.write(行+“”+n+“\r\n”);while(真){min=min.add(BigInteger.ONE);if(测试(min)==假)断裂;}}}public void put(int n,int v)引发IOException{put(n,新的BigInteger(“”+v));}//测试序列中是否已经有数字公共布尔测试(BigInteger v){布尔ret;if(v.compareTo(bsize)>=0){ret=(h.get(v.toString())!=空);}其他的{int i=Integer.parseInt(v.toString());ret=数组[i];} //System.out.println(“test”+v+“”+ret);返回ret;}}/*返回数字的排序因子列表-所有因子>1,直到并包括数字本身*/包装a166133;导入java.math。大整数;导入java.util。数组列表;/***@作者jmason*/公共类FactorList{//PrimeList pl;公共因素列表(/*PrimeList pl*/){/*this.pl=pl*/}公共ArrayList get(int n,BigInteger v){ 数组列表=新的数组列表();//得到素因子ArrayList pf=新PrimeFactorList(/*pl*/).get(v);//生成所有因子for(int i=0;i<pf.size();i++){int actual=list.size();BigInteger bi=(BigIntiger)(pf.get(i));if(!isin(list,bi))列表.添加(bi);for(int j=0;j<实际值;j++){BigInteger p=(BigInteger)(list.get(j));尝试{BigInteger m=p.multiply(bi);if(!isin(list,m))列表。添加(m);}catch(异常e){System.err.println(“v=”+v);System.err.println(“p=”+p);System.err.println(“bi=”+bi);抛出e;}}}//并对它们进行分类list=排序(list);返回列表;}//如果因子已在列表中布尔isin(ArrayList列表,BigInteger bi){for(int i=0;i<list.size();i++){大整数p=(BigInteger)(list.get(i));if(p.compareTo(bi)==0)返回true;}返回false;}//排序效率相当低数组列表排序(ArrayList列表){ArrayList-out=新的ArrayList();BigInteger开始=新的BigIntiger(“1”);while(真){BigInteger curr=null;for(int i=0;i<list.size();i++){BigInteger bi=(BigIntiger)(list.get(i));if(bi.compareTo(start)>0){if(curr==空)curr=bi;其他的if(bi.比较to(curr)<0)curr=bi;}}if(curr==空)断裂;开始=当前;输出添加(curr);}退出;}}/*生成所述输入数的素因子;最好不要称之为1;如果是素数,则返回数字本身*/包装a166133;导入java.math。大整数;导入java.util。数组列表;/****@作者jmason*/公共类PrimeFactorList{//PrimeList pl;公共PrimeFactorList(/*PrimeList pl*/){/*this.pl=pl;*/}public ArrayList get(BigInteger目标){//System.out.println(“PFList”+目标);数组列表=新的数组列表();BigInteger v=新的BigInteger(target.toString());while(真){BigInteger最小值=最小PF(v);//System.out.println(“minPF”+v+“=”+min);list.add(最小值);v=v.divide(最小值);if(v.compareTo(BigInteger.ONE)==0)断裂;}/*字符串s=“PFList of”+target+“is”;for(int i=0;i<list.size();i++)s+=(BigInteger)(list.get(i))+“”;System.out.println(s);*/退货清单;}//求输入的最小素因子public BigInteger minPF(BigIntiger目标){BigInteger delta=新的BigIntiger(“1”);整数n=0;/*这种性能改进没有for(素数p=pl.getFirst();(p.getValue().multiply(p.getValue())).compareTo(目标)<=0;p=pl.getNext(p))*/for(BigInteger bi=新的BigIntiger(“2”);(bi.multiply(bi)).compareTo(target)<=0;bi=双加(增量)){//BigInteger bi=p.getValue();if(target.mod(bi).compareTo(BigInteger.ZERO)==0){返回bi;}n++;如果(n==2)delta=新的BigInteger(“2”);}//System.out.println(“PFList”+目标);返回目标;} }