解:
a>0&&a<10
7)条件x=1与y=2有且只有一个成立.
解:
(x==1&&y!
=2)||(x!
=1&&y==2)
2.4设在求以下表达式之前,整型变量a的值是4,试指出在求了以下表达式之后,变量a、b和c的值。
1)
解:
a=5;b=16;
2)
;
解:
a=5;c=10
2.5编写一个程序,示意前缀++与后缀++的区别,前缀--与后缀--的区别。
分析:
其实只是在程序中简单地使用这两类自增、自减运算符就可以了,打印出运算前后的值就可以了,同学们可以自行写出,这里只给出参考程序:
publicclassXt25{
publicstaticvoidmain(String[]args){
inti=7,j=5,k=10,n=8,x,y;
System.out.print("变量i的值为"+i);
x=i++;
System.out.println(",执行赋值运算x=i++后,x的值为"+x+",i的值为"+i);//提示注意print和println的差别,并注意本题整体输入效果!
!
!
System.out.print("变量j的值为"+j);
y=++j;
System.out.println(",执行赋值运算y=++j后,y的值为"+y+",j的值为"+j);
System.out.print("变量k的值为"+k);
x=k--;
System.out.println(",执行赋值运算x=k--后,x的值为"+x+",k的值为"+k);
System.out.print("变量n的值为"+n);
y=--n;
System.out.println(",执行赋值运算x=--n后,y的值为"+y+",n的值为"+n);
}
}
程序运行结果:
变量i的值为7,执行赋值运算x=i++后,x的值为7,i的值为8
变量j的值为5,执行赋值运算y=++j后,y的值为6,j的值为6
变量k的值为10,执行赋值运算x=k--后,x的值为10,k的值为9
变量n的值为8,执行赋值运算x=--n后,y的值为7,n的值为7
2.6若一个数恰好等于它的因子之和,则这个数称为“完全数”。
编写程序求1000之内的所有完全数。
分析:
若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数。
求出所有真因子是解题的关键。
packagewanquanshu;//定义程序包名
publicclassXt26{//定义本题的类名
publicstaticvoidmain(String[]args){
System.out.println("1000以内的完全数有:
");//先输出一个标题
for(inti=1;i<=1000;i++){
intsum=0;
for(intj=1;j
if(i%j==0)sum+=j;
}
if(sum==i)//如果sum等于i,则其为“完全数”
{
//System.out.println("1000以内的完全数有:
");
System.out.print(sum+"\t");
}
}System.out.println("\n");
}
}
程序运行结果
1000以内的完全数有:
628496
2.7编写输入正实数x,求平方不超过x的最大整数n,并输出。
分析:
本题完全可以模仿教材例2.15中的处理方法:
即在for循环中将表达式2设置为测试循环变量k是否满足其平方值小于等于输入的正实数i,最后一次循环中,其循环变量必定是要求的“最大整数”,而循环体可以为空,什么也不做,因为我们只是对循环变量感兴趣。
此外,为了判定输入的数的合法性,可以使用”try......catch”语句。
importjavax.swing.JOptionPane;
publicclassXt27{
publicstaticvoidmain(String[]args){
intn,x;
Stringresult=(String)JOptionPane.showInputDialog(null,"请输入一个正整数","输入对话框",JOptionPane.PLAIN_MESSAGE,null,null,null);
//输入对话框
try//使用异常处理测试输入的数是否合法
{
x=Integer.parseInt(result);//将输入字符串转换为整数
}
catch(NumberFormatExceptione)
{
System.out.println("输入非法字符,程序结束!
!
!
");
return;
}
if(x<1)
{
System.out.println("输入的数不是正实数,程序结束!
!
!
");
return;
}
else{
for(n=1;n*n<=x;n++)//使用for循环,循环体为空,只是使用循环变量
;
n=n-1;//因为出循环时循环变量n的值恰好比能满足不等式n*n<=x的n值大1(比最后一次正常执行循环时的循环变量大1)
System.out.println("平方不超过"+x+"的最大整数是"+n);
}
}
}
除了使用循环体为空的for循环完成本题外,还可以直接使用数学函数完成,将上述程序中else后面的内容改为如下所示:
intn=(int)(Math.sqrt(i));//使用平方根函数
System.out.println("平方不超过"+i+"的最大整数,n="+n+";");
*
**
***
****
2.8输入正整数n,输出由n行n列星号字符组成的三角形图案。
以下是n=4的图案。
分析:
此题可借鉴例2.14。
importjavax.swing.JOptionPane;
publicclassXt28{
publicstaticvoidmain(String[]args){
intx,i,j,k,space=20;//设第一行星号从第20个字符位置开始
Stringresult=(String)JOptionPane.showInputDialog(null,"请输入一个正整数","输入对话框",JOptionPane.PLAIN_MESSAGE,null,null,null);
//输入对话框
try//使用异常处理测试输入的数是否合法
{
x=Integer.parseInt(result);
}
catch(NumberFormatExceptione)
{
System.out.println("输入非法字符,程序结束!
!
!
");
return;
}
if(x<1)
{
System.out.println("输入的数不是正实数,程序结束!
!
!
");
return;
}
else{
for(i=1;i<=x;i++,space-=2){//使用for循环输出x行星号,第1行1个,第2行2个,依次类推,共输出x行每行的相互两个星号间有一个空格
for(j=1;j<=space;j++)
System.out.print("");//每行(第i行)先输出space个空格
for(k=1;k<=i;k++)
System.out.print("*");//接着刚才的space个星号再输出i一个空格和i一个星号,至此,一行输出结束
System.out.println("\n");//换行,为输出下一行做准备
}
}
}
}
2.9设有整型变量x和y的值分别为5和110。
试指出执行了以下循环语句后,变量x和y的值分别试多少?
1)while(x<=y)x*=2;
解:
x=160;y=110;
2)do{x=y/x;y=y-x;}while(y>=1);
解:
x=18;y=0;(循环体总共执行8次)
2.10水仙花数是一个n(>=3)位数字的数,它等于每个数字的n次幂之和。
例如153是一个水仙花数,
。
试编写一个程序,求小于999的所有水仙花数。
分析:
先用for循环将数n有各位取出来,再进行计算。
此为本题关键!
!
!
思考:
能否用while循环?
解法1与解法2哪种通用性强?
解法1
publicclassXt210_1{
publicstaticvoidmain(String[]args)
{inti,a,b,c;
for(i=100;i<999;i++)//此循环要求熟记!
!
!
,可类推到千位、万位、十万位......
{a=i/100;//取出百位
b=(i-a*100)/10;//取出十位
c=(i-a*100-b*10);//取出个位
if(i==(a*a*a+b*b*b+c*c*c))
System.out.println("小于999的3位数中"+i+"是水仙花数");
}
}
}
解法2:
使用while循环,并使用判断函数,函数返回值为逻辑型数据,将要判断的数作为参数。
判断函数里要用到数组和Math函数pow(a,b),该函数返回参数a的b次幂不限定要判断的数只有3位数,可以大于3位,故只能使用不定次数的while循环。
在主函数中调用该函数,主函数中对设置输入对话框并对输入的数进行合法性判断。
importjavax.swing.JOptionPane;
publicclassXt210_2{
publicstaticvoidmain(String[]args){//从键盘输入一个大于100的整数,求出小于它的所有水仙花数
intx;
Stringresult=(String)JOptionPane.showInputDialog(null,"请输入一个大于等于100的正整数","输入对话框",JOptionPane.PLAIN_MESSAGE,null,null,null);
//输入对话框
try//使用异常处理测试输入的数是否合法
{
x=Integer.parseInt(result);//将输入字符串转换为整数
}
catch(NumberFormatExceptione)
{
System.out.println("输入非法字符,程序结束!
!
!
");
return;
}
if(x<100)
{
System.out.println("输入的数不大于100,程序结束!
!
!
");
return;
}
else{
System.out.println("你输入的数是"+x+",所有小于它的水仙花数如下:
");
for(inti=100;i{
if(isNarcissusNumber(i))//调用函数isNarcissusNumber判断
System.out.println("\t"+i+"是水仙花数");//如果是则输出
}
}
}
publicstaticbooleanisNarcissusNumber(intm)//判断是否是水仙花数的函数
{
intnumber=m;//把m存起来
inta[]=newint[100];//声明数组a用来存n每个位上的数
intamount=0;//表示n的位数
while(m>0)//通过循环得到m每个位上的数,存到数组中
{
a[amount]=m%10;//取余数
m=m/10;//整除10
amount++;
}
intsum=0;
for(intj=0;j{
sum+=Math.pow(a[j],amount);//这里使用math函数计算
}
if(number==sum)//如果累加的和等于这个数本身,则他是水仙花数,返回真
returntrue;
else
returnfalse;
}
}
如果输入的数是78963.则程序运行结果为
你输入的数是78963,所有小于它的水仙花数如下:
153是水仙花数
370是水仙花数
371是水仙花数
407是水仙花数
1634是水仙花数
8208是水仙花数
9474是水仙花数
54748是水仙花数
2.11编程序解百鸡问题:
鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。
百钱买百鸡。
求鸡翁、鸡母、和鸡雏个几何?
分析:
如果全习鸡翁,则只能买20只,全买鸡母,只能买33.3333只,全买鸡雏,最多允许买100只(理论上可买300只)。
因此各循环变量的范围就确定了。
publicclassXt211{
publicstaticvoidmain(String[]args){
inta,b,c,k;
k=0;
for(a=0;a<=20;a++)
for(b=0;b<34;b++)
for(c=0;c<100;c+=3)
{
if(a+b+c==100)
if((5*a+3*b+c/3)==100)
{k++;//每当有一种百钱买百钱买百鸡解法,k记录买法数
System.out.println("百钱买百鸡买法"+k+":
");
System.out.print("鸡翁只数:
"+a+"\t");
System.out.print("鸡母只数:
"+b+"\t");
System.out.println("鸡雏只数:
"+c);
}
}
}
}
百钱买百鸡买法1:
鸡翁只数:
0鸡母只数:
25鸡雏只数:
75
百钱买百鸡买法2:
鸡翁只数:
4鸡母只数:
18鸡雏只数:
78
百钱买百鸡买法3:
鸡翁只数:
8鸡母只数:
11鸡雏只数:
81
百钱买百鸡买法4:
鸡翁只数:
12鸡母只数:
4鸡雏只数:
84
2.12编写程序,按下面的公式计算自然对数底e的值:
e=1+1/1!
+1/2!
+1/3!
+1/4!
+......
解法1:
不使用函数调用,直接使用while循环
publicclassXt212_1{
publicstaticvoidmain(String[]args){
doubles=1,e=1.0;//e保存结果,初值为1,s为e中除初值外的每1项(每次循环中的1项)
intm=1,n=1;//m为s的分母(n的阶乘),初值为1,因为池n为1时其阶乘为1
while(s>1e-6)//不定次数循环,最后一项小于1e-6时停止循环
{
s=1.0/m;//使用1.0做分子是因为s的数据类型为双精度浮点数,如果只写1,则此处的值将为整数,不合题目要求
e+=s;//每次求和送变量e
n++;//n每次自增1
m*=n;//计算阶乘,此处是采用累乘的方式获得阶乘,为下一次循环计算s的值做好准备,注意学习此技巧}
System.out.println("自然对数底e的近似值为:
"+e+",精度为0.000001,最后一项为“1/"+n-1+"!
”");//注意为什么n要减1?
}
}
运行结果
自然对数底e的近似值为:
2.7182818011463845,精度为0.000001,最后一项为“1/10!
”
解法2:
使用专门的函数计算数的阶乘,在主函数中调用此函数
publicclassXt212_2{
publicstaticvoidmain(String[]args){//主函数
intn=1;
doubles=1.0,e=1.0;
while(s>1e-6)
{
s=1.0/factorial(n);//调用计算阶乘的函数factorial
e+=s;//将每次项进行累加送变量e中
n++;
}
System.out.println("自然对数底e的近似值为:
"+e+",精度为0.000001,最后一项为“1/"+n-1+"!
”");//注意为什么n要减1?
}
staticdoublefactorial(inta)//计算阶乘的函数,要求很熟练地使用
{
doublef=1.0;
for(intj=1;j<=a;j++)
f=f*j;
returnf;
}
}
2.13编写程序,用如下公式计算圆周率PI的近似值:
PI=4-4/3+4/5-4/7+4/9-4/11...
分析:
本题要搞清两个问题,一是每项的符号问题,单数项为正号,偶数项为负号,这可通过设立代表符号的变量sign,令其值为1,每次取其相反数即可。
第二个问题是要记录已经计算的项数和对应的近似值,在不定次循环while中记录循环次数,并判断计算结果与指定的近似值之差达到一定精度停止循环。
求π值可单独用一个函数完成。
publicclassXt213{
publicstaticvoidmain(String[]args){
doublepi_value;//定义变量存储函数计算结果
pi_value=pai(3.14D);//调用函数pai,实参为双精度常数,下同
System.out.println("四舍五入前的值为"+pi_value);//接着函数pai的打印信息后在同一行输出信息,下同
pi_value=pai(3.141D);
System.out.println("四舍五入前的值为"+pi_value);
pi_value=pai(3.1415D);
System.out.println("四舍五入前的值为"+pi_value);
pi_value=pai(3.14159D);
System.out.println("四舍五入前的值为"+pi_value);
}
staticdoublepai(doublepi_args)//求π值的函数
{
inti=0,n=1,sign=1,loop=0;//定义变量:
i为循环变量,n为每项的分母,sign
//为符号,1代表正号,-1代表负号,loop代表循环次数
doublepi=0,temp;
doubleargs_v;//定义变量用于控制计算精度
args_v=(pi_args==3.14?
1e-5:
(pi_args==3.141?
1e-6:
(pi_args==3.1415?
1e-7:
1e-8)));
//条件表达式根据实参传来的数值情况,给变量args_v赋值,注意学习这种赋值方法!
!
!
while((Math.abs(pi-pi_args))>args_v)//使用不定次数的循环,循环检测条件为计算的项的值大于控制精度
{
temp=4.0/n;//temp存储每项运算结果
pi+=sign*temp;//计算各项值并累加后送pi变量中
n+=2;//保持n值为奇数:
3,5,7,......(在第一次循环中n值为1)
sign=-sign;//每次更改符号
loop++;//记录循环次数,即计算的项数
}
System.out.print(pi_args+"是计算"+loop+"项后的结果,");//输出循环次数即计算项数
returnpi;//返回函数值给调用者
}
}
运行结果
3.14是计算624项后的结果,四舍五入前的值为3.139********61586
3.141是计算1686项后的结果,四舍五入前的值为3.1409995338317542
3.1415是计算10782项后的结果,四舍五入前的值为3.1414999064187703
3.14159是计算375434项后的结果,四舍五入前的值为3.1415899900057354
2.14回文整数是指正读法和反读相同的整数,编写一个程序,输入一个整数,判断他是否为回文整数。
分析:
本题的关键在判断回文数的方法。
可以用循环不断对10取方法得到各位上的数字和该数的总位数,并将各位上的数存入数组中,为后面判断是否回文作铺垫,循环的维持条件是不断整除10且结果不为0,要注意记录下循环次数,此次数就是要判断的数的位数。
再以此位数作为循环次数,在循环中对数组进行检测看是否是回文数。
以上工作可以放在一个函数中做。
此外,还应像2.10题那样对用户输入的要判断的数进行合法性检查。
importjavax.swing.JOptionPane;
publicclassXt214{
publicstaticvoidmain(String[]args){
intx;
booleanyesno;
Stringresult=(String)JOptionPane.showInputDialog(null,"请输入一个大于等于1的正整数","输入对话框",JOption