整数分解与for循环
对整数做分解是一类经常遇到的问题
整数的分解
- 一个整数是由多个1至多位数字组成,如何分解出整数的各个位上的数字,然后加以计算
- 对一个整数做%10的操作,就得到它的个位数;
- 对一个整数做/10的操作,就去掉了它的个位数;
- 然后再对2的结果做%10,就得到原来数的十位数了;
- 以此类推
这个我们整数分解第一种方法
第一种方式结果,不难看出来,这样的倒序不符合常理,700倒序应该是7,这个007是什么鬼,所以我们就要换一个方案
第二种方案,首先是定义一个初始化值,使用初始化值*10+digit
第二种方案的结果,第二种方式中的result就只有7而里面一个digit在输出我们就测到了007
假如这个程序我一开始的时候用了while条件一样的
while中的最后结果 352 和 700都是没错的,但是一到0就会有一点小不一样
所以while和都while还是一些微妙的差异的,这些差异在你具体做程序的时候啊,你要根据你实际情况来作出选择
for循环
如果我们今天算阶层,我们知道阶乘的定义是什么呐,任何一个数的阶乘就是从1*2*3一直乘到这个数为止,那个得出来的一个相乘的结果叫做阶乘
阶乘
- n!=1x2x3x4x....xn
- 写一个程序,让输入n,然后计算输出n!
- 变量
- 显然读用户的输入需要一个int的n,然后计算的结果需要用一个变量保存,可以是int的factor,在计算的结果需要用一个变量保存,在计算中华需要有一个不断地从1递增到n,那可以是int的i
表达累积的结果应该初始化为1 ,因为他需要反复,肯定要有一个循环结构
3的阶乘为6 6的阶乘是720 ,10 的阶乘3628800、20的阶乘-2102132736 问题来为什么20的阶乘是负,那就说明我们的程序还某个地方不对,
为什么不能算很大的阶乘
在数学中自然数是没有边界的正数可以无限大,反之负数也是可以的,一张白纸实际上是有边界的,你所表达的数还是有限的,在计算机内部是用内存我们的表达对于我们这样的int类型来说,在计算机中它是4个字节,它表达的数最大是二的30 31次减一2的31次方,只有这个范围的数,他才是有效的,所以int只能表达这么大了,20阶乘非常大了已经无法用int来表达这个数了
这就形成我们一个新的循环 叫做for循环,它的关键字是for,这是for循环是分成三个区域,第一个区块是坐初始化的事情,第二个区块是条件,第三个区块这不是就是我们每次放到那个一轮结束的那件事情代表的循环体
for循环
for循环像一个技术循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步进进行调整比如加1或者减1
for(int=0;i<5;i=i+1){
System.outprintln(i)
}
- for(初始化;条件;单步动作){
}
- 第一部分是一个初始化,可以定义一个新的变量:intcount=10或者直接赋值 i = 10。
- 第二个部分是循环维持的条件。首先要检验条件是否满足才执行循环;条件不满足就结束循环。
- 第三个部分是步进,即每轮执行了循环体之后,必须执行的表达式。通常我们在这里改变循环变量,进行加或减的操作
for=对于
- for(count=10;count>0;count=count-1)
- 就读于:“对于一开始的count=10”,当count>0时,重复循体,每一轮循环在做完循环体内语句后,使得count递减
- 循环控制变量i只在循环里被使用了,在循环外面它没有任何用处。因此,我们可以把变量i的定义写到for语句里面去
for循环
for(初始动作;条件;每轮){
}
for中的每一个表达式都是可以省略的for(;条件;)== while(条件)
for循环中的一个小错误 空循环
for(i=0;i<=10;i++);
for(i=0;i<=10;i++)
System.out.println(i)
强烈建议:只要是for语句,就是一定跟上一对大括号
循环次数
for(i=0;i<n;i=i+1)
则循环的次数是n,而循环结束以后,i的值是n。循环的控制变量i,是选择从0开始还是从1开始,是判断i<n还是判断i<=n对循环的次数,循环结束后变量的值都有影响
Tips for loops
如果有固定的次数,用for
如果必须执行一次,用do-while
其他情况while