版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
学习一门语言的最好方法是使用它。
程序要求说明
这两个程序可以用来巩固java语言基础,暂不涉及class的使用。
程序一:
验证java浮点数相除结果。讨论的除法对象有“有穷正数、有穷负数、+0、-0、+infinite、-infinite、NaN”,我们编程看看它们两两相除会产生什么结果?,
程序二:
找出4位数的所有吸血鬼数字。
解释一下吸血鬼数字:吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,这对数字各包含乘积一半位数的数字,数字选取后可任意排序。例如:1260=21乘以60、1827=21乘以87、2187=27乘以81,都是吸血鬼数字。
程序环境说明:notepad编写,cmd下编译和运行。
第一个程序
1. 编程思路
将七个值放到数组里,然后一个7*7循环遍历完成相除,打印结果即可。注意“有穷正数"和”有穷负数“可以选一个常数来代表,我这里选的是”6.66“和”-6.66“。
另外,为了程序效果,加入一个额外的label数组放置字符串标签,目的是为了打印”有穷正数"和“有穷负数”这两个字符串。
2.代码展示
public class doubleDivision
{
public static void main(String[] args){
//与value数组下标一一对应的字符串标签
String[]label={"有穷正数","有穷负数","+0","-0","Infinity","-Infinity","NaN"};
//这里我选用6.66代表"有穷正数",-6.66代表"有穷负数"
double[]value={6.66,-6.66,+0.0,-0.0,Double.POSITIVE_INFINITY,Double.NEGATIVE_INFINITY,Double.NaN};
//两个循环遍历任意两个数之间的除法
for(int i=0;i<7;i++){
for(int j=0;j<7;j++){
if((int)(value[i]/value[j])==1)//由value数组的赋值来看,结果中的‘1’对应"有穷正数"。
System.out.println(label[i]+" 除以 "+label[j]+" 的结果是: 有穷正数");
else if((int)(value[i]/value[j])==-1)//由value数组的赋值来看,结果中的‘-1’对应"有穷负数"。
System.out.println(label[i]+" 除以 "+label[j]+" 的结果是: 有穷负数");
else//其他就不用转化了,直接上值。
System.out.println(label[i]+" 除以 "+label[j]+" 的结果是: "+value[i]/value[j]);
}
System.out.println();
}
}
}
3.运行效果
第二个程序
1. 编程思路
我比较笨,用的是笨办法。
基本思路是:
从1000到9999逐个检测。
每一次检测先提取出个、十、百、千四个位,然后这四个数共有A4 2=12种排列,对这12种排列方式所组成的两个两位数逐一检验,满足要求就打印并跳出内部循环,不满足要求则继续检验直到内部循环跑完。
然而我这里是直接4*3*2=24种排列方式,也就是有一半的冗余,真难过。
2.代码展示
public class vampireDigit
{
/**********变量说明
*digit:待检测数。
*digits[4]:存放检测数的个、十、百、千位。
*temp1:由digit得到的第一个两位数。
*temp2:第二个两位数。
*count:辅助变量,用于提取剩余的两个数字。
*tempdigits:辅助变量,存放剩余的两个数字。
*flag:指示待检测数是否为吸血鬼数字,初始置为0。
*********************/
public static void main(String[] args){
int[] digits=new int[4];
int[] tempdigits=new int[2];
int temp1,temp2,count,flag;
for(int digit=1000;digit<10000;digit++){
//这里是提取检测数的四个位。
digits[0]=digit/1000;
digits[1]=(digit%1000)/100;
digits[2]=(digit%100)/10;
digits[3]=digit%10;
//对于每一个待检测数,都应在检测逻辑开始之前置flag为0。
flag=0;
//两个循环,选出digits中的两个数字,且下标不能相等。
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(j!=i){
temp1=10*digits[i]+digits[j];//计算temp1。
count=0;
for(int k=0;k<4;k++)//这里是提取剩余的两个数字,存放到tempdigits中。
if(k!=i&&k!=j)
tempdigits[count++]=digits[k];
temp2=10*tempdigits[0]+tempdigits[1];//计算temp2。
if(temp1*temp2==digit){
System.out.println(digit);
flag=1;
}
else{
temp2=10*tempdigits[1]+tempdigits[0];//tempdigits的第一种排列不满足要求,检测第二种排列。
if(temp1*temp2==digit){
System.out.println(digit);
flag=1;
}
}
}
if(flag==1)//检测数为吸血鬼数字,跳出内部检测逻辑,检测下一个数。
break;
}
if(flag==1)
break;
}
}
}
}