您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > java趣味编程100实例
1_1问题描述:根据福利彩票的规则,6个蓝色球,范围1--32,不允许重复,1个红色球,范围1-16,自动生存6个蓝色球,1个红色球。importjava.util.Arrays;importjava.util.Random;importjava.util.Scanner;publicclassCh11_2{/***根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组*@parambegin最小数字(包含该数)*@paramend最大数字(不包含该数)*@paramsize指定产生随机数的个数**实现思路:首先定义一个方法,使它能够产生6个不重复的蓝色随机数,存放到数组中,*再产生1个红色随机数,最后他们组合在一起就是题目所求*/publicstaticint[]generateRandomNumber(intbegin,intend,intsize){//加入逻辑判断,确保beginend并且size不能大于该表示范围if(begin=end||(end-begin)size){returnnull;}//种子你可以随意生成,但不能重复里面存放的是你的取值范围//本题就是[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]int[]seed=newint[end-begin];for(inti=begin;iend;i++){seed[i-begin]=i;}int[]ranArr=newint[size];Randomran=newRandom();//数量你可以自己定义。这里生成了6个蓝色球的号码for(inti=0;isize;i++){//得到一个位置intj=ran.nextInt(seed.length-i);//得到那个位置的数值ranArr[i]=seed[j];//将最后一个未用的数字放到这里,这样就把取出的数覆盖了,达到了不重复的目的。seed[j]=seed[seed.length-1-i];}returnranArr;}publicstaticvoidmain(String[]args){int[]ranArr={};intred;Scannerinput=newScanner(System.in);Randomran=newRandom();System.out.println(欢迎使用双色球自动摇号系统);System.out.print(确实摇号(y/n)?);Stringgo;go=input.next();while(go.equalsIgnoreCase(y)){ranArr=generateRandomNumber(1,33,6);red=ran.nextInt(16);System.out.println(Arrays.toString(ranArr)++red);System.out.print(继续摇号(y/n)?);go=input.next();}System.out.println(谢谢使用!);}}1_2超长整数的相加问题描述:编写程序,实现超过整形变量存储范围数据的相加importjava.util.Arrays;importjava.util.Scanner;publicclassCh11_4{/***实现思路:1将两个超长的整形转换为字符串*2将两个字符串变为等长,如:30812111123298----3081211112300000000289*3将两个字符串对应相加,结果存到到另一个字符串*4最后对新的字符串做进位处理*@paramargs*/publicstaticvoidmain(String[]args){//Scannerinput=newScanner(System.in);//System.out.print(请输入第一个加数:);//StringaddA=input.next();//System.out.print(请输入第二个加数:);//StringaddB=input.next();StringaddA=30812111123;StringaddB=298;//调用方法计算结果,输出System.out.println(addA+++addB+=+strvalue(addA,addB));}/***将两个字符串相加,得到新的字符串*/publicstaticStringstrvalue(StringaddA,StringaddB){Stringstrvalue=;intlenA=addA.length();intlenB=addB.length();inttemplen=0;//调整长度相同if(lenA=lenB){templen=lenA-lenB;addB=maxlen(addB,templen);//调整长度,使其跟大数长度一致}else{templen=lenB-lenA;addA=maxlen(addA,templen);}charaddcharA[]=addA.toCharArray();charaddcharB[]=addB.toCharArray();intlen=addcharA.length;intvalueC[]=newint[len];for(inti=0;ilen;i++){//取出字符串中的数转换为数字inta=Integer.parseInt(String.valueOf(addcharA[i]));intb=Integer.parseInt(String.valueOf(addcharB[i]));valueC[i]=a+b;//每项相加存储}System.out.println(Arrays.toString(valueC));inttmp=0;//代表进位//处理进位从个位开始for(inti=valueC.length-1;i=0;i--){if(valueC[i]=10){strvalue=String.valueOf(valueC[i]+tmp-10)+strvalue;tmp=valueC[i]/10;}else{strvalue=String.valueOf(valueC[i]+tmp)+strvalue;tmp=0;}}returnstrvalue;}//调整长度,使其长度一样privatestaticStringmaxlen(Stringstr,inttemplen){Stringstrmax=null;StringBufferbuff=newStringBuffer();for(inti=0;itemplen;i++){buff.append(0);}strmax=buff.toString()+str;returnstrmax;}}1_3尾数前移问题描述:求一个自然数N,个位数是6,将6提到最前面得到的数是N的4倍publicclassCh11_5{/***问题分析:1假设这个数是n6(n是从1开始的正整数)*2满足关系6n=4*(n6)*3n6=n*10+6;6n=6*Math.pow(10,i)+n;i代表的是6处在的是十位还是百位等等(十位i=1....)*@paramargs*/publicstaticvoidmain(String[]args){intn=0;//代表6的前面部分,“n6”intN;//6移动前,即N=n6intM;//6移动到数字首部后,即M=6nintbuf;inti=0;//代表数字的长度while(true)//穷举{//移动前N=n*10+6;buf=n;//计算数字的长度,确定6移到首部的权重,即:6代表的是十位还是百位等等while(buf!=0){i++;buf=buf/10;}//移动后M=(int)(6*Math.pow(10,i))+n;//条件满足,输出,退出循环if(M==(4*N)){System.out.print(要找的数为:+N);break;}n++;//穷举变量修改i=0;//长度值复位}}}1_4国际象棋有八行八列,64个单元格,在棋盘上摆放八个皇后,使其不能相互攻击,就是说任意两个皇后不能处在同一行,同一列或同一斜线上,问一共有多少中摆法importjava.util.Arrays;publicclassCh11_6{staticintresult=0;staticint[]WeiZhi=newint[8];//全局数组,下标代表行,里面的元素代表列(就是我们上算法分析的解向量)staticvoidEightQueen(intn)//算法{inti,j;intct;//用于判断是否冲突,1代表不冲突if(n==8)//若8个皇后已放置完成{System.out.println(Arrays.toString(WeiZhi));result++;return;}for(i=1;i=8;i++)//试探{WeiZhi[n]=i;//在该列的第i行上放置//断第n个皇后是否与前面皇后形成攻击ct=1;for(j=0;jn;j++){if(WeiZhi[j]==WeiZhi[n])//形成攻击{ct=0;}elseif(Math.abs(WeiZhi[j]-WeiZhi[n])==(n-j))//形成攻击{ct=0;}else{}}if(ct==1)//没有冲突,就开始下一列的试探EightQueen(n+1);//递归调用}}publicstaticvoidmain(String[]args){EightQueen(0);//求解System.out.println(一共有+result+种解法);}}1_5评委计分问题问题描述:有10个评委为参赛选手打分,分数是1到100。选手最后的得分是:去掉一个最高分,去掉一个最低分,其余8个评委取平均值。importjava.util.Scanner;publicclassCh11_7{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);intnum,i,max,min,sum,avg;max=0;/*先假设当前的最大值max为0*/min=100;/*先假设当前的最小值min为100*/sum=0;/*将求累加和变量的初值置为0*/for(i=1;i=10;i++){System.out.print(请第+i+评委输入分数:);num=in.nextInt();/*输入评委的评分*/sum+=num;/*计算总分*/if(nummax)max=num;/*通过比较筛选出其中的最高分*/if(nummin)min=num;/*通过比较筛选出其中的最低分*/}System.out.printf(去掉一个最高分:%d\n去掉一个最低分:%d,max,min);avg=(sum-max-min)/8;System.out.printf(\n平均得分:%d,avg);/*输出结果*/}}1_6罗马数字将阿拉伯数字(0到1000)转换为罗马数字,对应关系如下表123456789ⅠⅡⅢⅣⅤⅥⅦⅧⅨ102030405060708090XXXXXXXLLLXLXXLXXXXC100200300400500600700800900CCCCCCCDDDCDCCDCCCCMimportjava.util.Scanner;publicclassCh11_8{//建立对照表staticStringa[][]={{,I,II,III,IV,V,VI,VII,VIII,IX},{,X,XX,XXX,XL,L,LX,LXX,LXXX,XC},{,C,CC,CCC,CD,D,DC,DCC,DCCC,CM}};publicstaticvoidmain(Stringargs[]){Scannerin=newScanner(System.in);Syste
本文标题:java趣味编程100实例
链接地址:https://www.777doc.com/doc-5352404 .html