题目一:求1000!的结果中包含多少个0?注:1000! = 1×2×3×4×5×...×999×1000
/*我们不能把它们都乘起来得出结果后再去不断%10,因为这个积太大了,我们所学的数据类型根本装不下。那么就从结果去分析:包含多少个0也就意味着看每个数是否能被10整除,或者数的积能否被10整除。%10的等于0的情况有两种:以0结尾的数或者以结尾为2和结尾为5的数的积的值。也就是说我们找到能够%10==0或者%5==0的数,把它们的个数相加即可,之所以不是%2,是因为能够%5的话,肯定之前的所有的数的积能够整除10,而%2却不一定,比如1到10,1*2的积不能够整除10,而1*2*3*4*5的积是可以%10的。也就是说我们这样去写程序,判断每个数是否%10或%5等于0,是的话计数器+1;在判断这个数是否%100等于0,是的话再+1.。。。如此类推。
*/
class ArithDemo
{
public static void main(String[] args)
{
System.out.println(numsOfZero(1000));
}
public static int numsOfZero(int num)
{
int x=1,count=0;
while(x<=num)
{
if(x%10==0 || x%5==0) count++;
if(x%100==0) count++;
if(x%1000==0) count++;
x++;
}
return count;
}
}
题目二:
/*
需求:用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行fianlly?
*/
class TryFinallyDemo
{
public static void main(String[] args)
{
System.out.println(returnValue1()); //返回30
System.out.println(returnValue2()); //返回20
System.out.println(returnValue3()); //返回20
System.out.println(returnValue4()); //返回30
/*
根据这四种不同情况可以得出:
用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行finally?一般我们认为是在return之前执行,但是更细点说,是在return中间执行。从returnValue3中可以看出,结果返回的是20,这似乎说明finally中的代码没有执行。但是从returnValue1方法返回30看出,finally确实比try中的return先执行,这岂不是自相矛盾。但是仔细想一下,其实它们是这样执行的:当执行到try中的return语句时,先用一个记录器暂时记录下返回的结果,然后执行finally中的代码,finally中如果对num重新赋了值,且有return返回,那么最终结果是重新赋值后的结果。如果finally中光赋了值,但是没有返回,num值虽然变了,但是由于没有返回,所以return记录器中的值还是之前的值。
*/
}
public static int returnValue1()
{
int num=10;
try{
num=20;
return num;
}
finally{
num=30;
return num;
}
}
public static int returnValue2()
{
int num=10;
try{
num=20;
return num;
}
finally{
return num;
}
}
public static int returnValue3()
{
int num=10;
try{
num=20;
return num;
}
finally{
num=30;
}
}
public static int returnValue4()
{
int num=10;
try{
return num;
}
finally{
num=30;
return num;
}
}
} |