4.1 for 循环
阶乘
输入:n 输出:n!
- 如果使用while循环,编程如下:
Scanner in = new Scanner(System.in);
int n= in.nextInt();
int i =1;
int factor =1;
while (i<=n)
{
factor=factor*i;
i=i+1;
}
System.out.println(factor);
结果错误:当输入20,输出结果为负数
原因:计算机是内存是有限的,int 是4-byte,范围是[-231,231-1] 20的阶乘已经超过了这个范围
for循环的使用
for (int i=1; i<=n; i=i+1)
“对于一开始的i=1,当i<=n的时候,进入循环,每次循环完成以后i+1”
1)可以在for的括号内部进行变量的定义,只在循环内使用
2)for循环的每个表达式可以省略的但是分号不可省略
3)加上分号成为空循环
4)循环次数——从0开始小于n——n次
for(;条件;)==while(条件)
- 如果使用for循环,编程如下
Scanner in = new Scanner(System.in);
int n= in.nextInt();
int factor =1;
for (int i=1; i<=n; i=i+1)
{
factor=factor*i;
}
System.out.println(factor);
还是会出现负数
循环使用的tips
- 如果有固定次数,用for
- 如果必须执行一次,用do-while
- 其他情况用while
复合赋值
a+=6 (a=a+6)
a-=6(a=a-6)
a/=b+6 (a=a/(b+6))
i++(i=i+1)
i=6 后缀:a=i++(a=6,i=7) 先赋值再计算
前缀: a=++i (a=7,i=7) 先计算再赋值
4.2 循环控制
素数-只能被1和本身整除,不包括1
如何判断一个数是素数?
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int isPrime = 1;
for (int i =2; i<n; i++)
{
if(n % i==0)
{
isPrime = 0;
System.out.println(n+"不是素数");
break;
}
}
if (isPrime == 1)
{
System.out.println(n+"是素数");
}
}
break 和continue的区别
break是跳出大的循环,continue是后面语句不再进行还是要进行循环
多重循环
如何输出100以内的素数 ?
Scanner in = new Scanner(System.in);
// int n = in.nextInt();
for (int n =2; n<100; n++)
{
int isPrime = 1;
for (int i =2; i<n; i++)
{
if(n % i==0)
{
isPrime = 0;
// System.out.println(n+"不是素数");
break;
}
}
if (isPrime == 1)
{
System.out.print(n+" ");
// println是要换行的
}
break和continue的标号
在循环之前可以放一个标号来标识循环;
labal:
带标号的break和continue对那个循环起作用
//穷举,100元
Scanner in = new Scanner(System.in);
int amount = in.nextInt();
OUT:
for(int one = 0; one <= amount; ++one)
{
for(int five = 0; five <= amount/5; ++five)
{
for(int ten = 0; ten <= amount/10; ++ten)
{
for(int twenty = 0; twenty <= amount/20; ++twenty)
{
if (one+5*five+ten*10+twenty*20 == amount)
{
System.out.println(one+"张一元,"+five+"张五元,"+ten+"张十元,"+twenty+"张二十元");
break OUT;
}
}
}
}
}
逻辑类型
将赋予变量的0与1换成另一种形式:
boolean isPrime = true;
isPrime = false;
逻辑类型只有true和false
!
&& 与
|| 或
举例
x>4&&x<6
优先级
!>&&>||
4.3循环的例子
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int sign = 1;
double result = 0.0;
for ( int i=1; i<=n; i=i+1 )
{
result = result + sign * 1.0 / i;
sign = - sign;
}
System.out.println(result);
最大公约数
枚举
int a = in.nextInt();
int b = in.nextInt();
int ret = 0;
int i;
for ( i = 2; i <= a && i <= b ; i=i+1 ) {
if ( a%i == 0 ) {
if ( b%i == 0 ) {
ret = i;
}
}
}
System.out.println(a+""+b+""+ret);
}
辗转相除法
Scanner in = new Scanner(System.in);
int a,b;
int t;
a = in.nextInt();
b = in.nextInt();
int origa = a;
int origb = b;
while ( b != 0 ) {
t = a%b;
a = b;
b = t;
}
System.out.println(origa+""+origb+""+a);
家庭作业
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int k = 0;
int sum = 0;
int a = 0;
for (int i=2;i<=200;i++)
{
int isPrime = 1;
for (int p =2; p<i; p++)
{
if(i % p==0)
{
isPrime = 0;
// System.out.println(n+"不是素数");
break;
}
}
if (isPrime == 1)
{
k=k+1;
if(k==n+a)
{
a=a+1;
sum=sum+i;
}
if(k==m)
{
System.out.println(sum);
}
}
}
}
读数字
思路:拆开数字,对应一个含有字符的数组
Scanner in = new Scanner(System.in);
int number = in.nextInt();
String[] voice = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
// System.out.println(voice[1]);
if (number<0)
{
System.out.print("fu"+" ");
number=-number;
}
if(number==0)
{
System.out.print("ling");
}
if (number>0)
{
int result=number;
int m= 0;
while(result!=0)
{
result=result/10;
m++;
}
int[] a =new int[m];
int j=0;
while(number!=0) {
a[j]=number%10;
number=number/10;
j++;
}
int n;
for (int k=0;k<a.length;k++)
{
n=a[a.length-1-k];
System.out.print(voice[n]+" ");
}