Java(1)

来源:互联网 发布:自动铅笔 知乎 编辑:程序博客网 时间:2024/06/16 20:13

这星期用eclipse写了程序语言设计基础的课后习题。新手上路,请多指教。

编程总结:

一、十进制转十六进制

public static void main(String[] args) {Scanner input=new Scanner(System.in);int num=input.nextInt(),count=0,remainder;char []h=new char[100];for(int i=0;num>0;i++){count++;remainder =num%16;switch(remainder) {case 15: h[i]='F';break;case 14: h[i]='E';break;case 13: h[i]='D';break;case 12: h[i]='C';break;case 11: h[i]='B';break;case 10: h[i]='A';break;default: h[i]=(char)(48+ remainder);//数字0的ASCII码值为48}num/=16;}for(int i=count-1;i>=0;i--)//在数组中count要减一System.out.print(h[i]);}
一开始在写余数为0-9的case中直接使用(char)remainder,然后马上反应过来这样会直接以remainder的值作为字符的ASCII码,最后输出ASCII码值为0-9的字符,不是预期的结果。后来想到可以用上面红色字体标注的语句来获得真正想要的字符。这是一个很好的把int直接转化为char(eg. 数字3转化成字符‘3’)的办法。

此外,第一次运行的时候发现结果的最前面有一个多余的0。这是因为忘记了count是字符的个数,但数组下标是从0开始的,应该要减一,否则就多了一个默认字符‘0’。


二、判断素数

public static void main(String[] args) {int count=0,number=2;while(number<1000) {boolean isPrime=true;for(int divisor=2;divisor<=number/2;divisor++) if(number%divisor==0) {isPrime=false;break;}if(isPrime) {count++;if(count%10==0)System.out.println(number+" ");elseSystem.out.print(number+" ");}number++;}}
一开始没想到这个方法,一直在纠结第一个数是从3开始最后再补一个2还是......但在看了书上的例题后才发现自己的想法是错误的。应该设置一个判断是否为素数的isPrime布尔型变量,初始值设为true,然后通过它来决定是否输出。2也可以放到循环中,除数才应该从2开始增加。因为2小于2/2=1,所以number=2时不进入循环直接被判断是素数。

三、数字金字塔

public static void main(String[] args) {System.out.print("Input an integer(1-15) : ");Scanner input=new Scanner(System.in);int num=input.nextInt();for(int i=1;i<=num;++i){for(int j=num-i;j>=1;--j)System.out.print(" ");for(int j=i;j>=1;--j)System.out.print(j);for(int j=2;j<=i;++j)System.out.print(j);System.out.println();}}

运行结果:

与要求稍有不符。原图中数字之间有一个空格,更为美观清晰。但因为不知道怎么控制输出格式,暂时先做出这个效果。


四、找出整数的所有最小因子

public static void main(String[] args) {Scanner input=new Scanner(System.in);int num=input.nextInt(),i=2,ori=num;if(num<=0)System.out.println("Wrong!");else if(num==1)System.out.println(1);else {while(i<ori&&num>0){if(num%i==0){System.out.print(i+" ");num=num/i;}elsei++;}if(ori==num)System.out.println(1+" "+i);}}
一开始在程序中判断循环的条件是i<num&&num>0,但是发现运行结果错误。这是因为num若被i除后会越来越小,正确的方法应该是设置一个org记录原始输入的数据,并以它来当作判断条件。

五、模拟表的倒计时

public static void main(String[] args) {Scanner input=new Scanner(System.in);int seconds=input.nextInt();long currentTime=System.currentTimeMillis(),out=seconds;while((seconds-(System.currentTimeMillis()-currentTime)/1000)>=0)//剩余秒数if((System.currentTimeMillis()-currentTime)%1000==0&&out!=seconds-(System.currentTimeMillis()-currentTime)/1000)//避免多次输出if((seconds-(System.currentTimeMillis()-currentTime)/1000)!=0) {out=seconds-((System.currentTimeMillis()-currentTime)/1000);if(out==1)System.out.println(out+"second remaining");elseSystem.out.println(out+"seconds remaining");}else{System.out.println("Stopped");break;}}

第一次写的代码运行后输入3,结果重复了几十个3到重复几十个Stopped......甚至重复到几十个 -3.......

仔细一看,发现自己真的是太粗心大意了,应该设置的限制条件都没设置:

1、避免多次输出同一个数值:

out!=seconds-(System.currentTimeMillis()-currentTime)/1000

2、区分复数和单数的英文

if(out==1)
3、当剩余秒数为0时应输出一次Stopped就跳出循环,结束程序,因此应该加上break语句。

运行结果:


六、整数转化为16位二进制数

public static void main(String[] args) {Scanner input=new Scanner(System.in);int num=input.nextInt();int[] output=new int[16];for(int i=0;i<16;i++)output[i]=0;int i=0,temp;for(;num>0;i++) {output[i]=num%2;num/=2;}if(num>=0)for(int k=15;k>=0;k--) System.out.print(output[k]);else {String out=Integer.toBinaryString(num);char ch [] = out.toCharArray();for(int k=16;k<out.length();k++)System.out.print(ch[k]);}}

本来想用求正数的方法按位取反再加一得到负数的补码,但是在实际操作中发现较为复杂,因为加一后可能还会进位。因此对于负数,可以用toBinaryString的方法获得32位的二进制数。但题目要求16位,可以将字符串转化为字符数组再截断输出。

对于整数采用的就是普通十进制转化成二进制的方法,最后逆序输出即可。但同样也可以用toBinaryString的方法实现。

原创粉丝点击