[java] 자바의 정석 연습문제 ch04

4-1

1. x>10 & x<20 or x>10 && x<20

2. !(ch == ' ' | ch == '\t') or ch != ' ' | ch != '\t'

3. (ch == 'x' | ch == 'X')

4. (ch >= '0' & ch <= '9')

5. (ch >= 'a' & ch <= 'z' | |ch >= 'A' & ch <= 'Z')

6. (year%400 == 0 || (year%4 == 0 & year%100 != 0))

7. (!powerOn)

8. (str.equals("yes"))

 

4-2

int sum = 0;

for(int i=1;i<=20;i++){

if(i%2 != 0 & i%3 != 0)

sum += i;

}

System.out.println(sum);

 

4-3

static int sum(int num){

if(num == 1)

return 1;

return num+sum(num-1);

}

public static void main(String[] args) {

int sum = 0;

for(int i=1;i<=10;i++)

sum += sum(i);

System.out.println(sum);

}

 

4-4

int sum = 0;

int i;

for(i=1;;i++){

if(i%2 == 0)

sum += -i;

else

sum += i;

if(sum >= 100)

break;

}

System.out.println(i+" : "+sum);

4-5

int i = 0,j = 0;

while(i<=10){

j = 0;

while(j<=i){

System.out.print("*");

j++;

}

i++;

System.out.println();

}

 

4-6

for(int i=1;i<=6;i++){

for(int j=1;j<=6;j++){

if(i+j == 6)

System.out.println("i: "+i+", j: "+j+", sum: "+(i+j));

}

}

 

4-7

int value = (int)(Math.random()*6)+1;

 

4-8

for(int x=0;x<=10;x++){

for(int y=0;y<=10;y++){

if(2*x+4*y == 10)

System.out.println("x="+x+", y="+y);

}

}

 

4-9

String str = "12345";

int sum = 0;

for(int i=0;i<str.length();i++){

sum += str.charAt(i) - '0';

}

System.out.println(sum);

 

4-10

int num = 12345;

int sum = 0;

 

int pst1 = 10;  // 나머지 구하기 위한 자리수

int pst2 = 1;  // 1의 자리로 만들기 위한 자리수

int tmp;  // 나머지값 저장할 임시변수

while(num != 0){

tmp = num % pst1;  // 나머지 구해서

sum += (tmp/pst2);  // 1의자리로 만든 다음에 더해줌

num -= tmp;  // 나머지만큼 원래 숫자에서 빼줌

pst1 *= 10;  // 자리수 증가

pst2 *= 10;

}

System.out.println(sum);



4-11

int num1 = 1;

int num2 = 1;

int num3 = 0;

System.out.print(num1+","+num2);

 

for(int i=0;i<8;i++){

num3 = num1+num2;

System.out.print(","+num3);

int tmp;

tmp = num2;

num2 = num3;

num1 = tmp;

}



4-12

int x = 1, y = 1, tmp, tmpSum = 0;

for(int i=0;i<3;i++){  // 행1

for(int j=1;j<=3;j++){  // 행2

tmp = 1;  // 열에서 단수 증가 시키려고

for(int k=0;k<3;k++){  // 열

tmpSum = x+tmp;

if(tmpSum == 10)  // 10단 출력 안하게

break;

System.out.print(tmpSum+"*"+j+"="+(tmpSum*j)+'\t');

tmp++;

}

System.out.println();

}

x += 3;  // 행2 끝나면 단수 증가 +3

System.out.println();

}

 

4-13

String value = "12o34";

char ch = ' ';

boolean isNumber = true;

 

for(int i=0;i<value.length();i++){

if(!(value.charAt(i) >= '0' & value.charAt(i) <= '9')){

isNumber = false;

break;

}

}

if(isNumber)

System.out.println(value+"는 숫자입니다.");

else

System.out.println(value+"는 숫자가 아닙니다.");

 

4-14

int answer = (int)(Math.random()*100)+1;

int input = 0;

int count = 0;

 

java.util.Scanner sc = new java.util.Scanner(System.in);

 

do{

count++;

System.out.print("1과 100사이의 값을 입력하세요 : ");

input = sc.nextInt();

 

if(input < 0 | input > 100){

System.out.println("input error!");

if(count > 0)

count--;

}

else if(input > answer)

System.out.println("Down!");

else if(input < answer)

System.out.println("Up!");

else{

System.out.println("congratulation!!!");

System.out.println("Count is "+count);

break;

}

} while(true);

 

4-15

int number = 12321;

int tmp = number;

 

int result = 0;

 

// 총 몇자리 숫자인지 먼저 검사

int cnt = 0; // 자리수 카운트 할 변수

for(int pst=1;;pst*=10){

if(tmp/pst == 0)

break;

cnt++;

}

 

int pst = 1;

int pst1 = 10;

int pst2 = 1;

final int POSITION = 10;

int tmpNum = 0;

while(tmp != 0){

tmpNum = (tmp % pst1);  // 나머지 구한 후

tmp -= tmpNum;  // 원래값에서 나머지 빼고(반복문 종료를 위해)

tmpNum /= pst;  // 나머지를 다시 1의 자리로 만듦

for(int i=1;i<cnt;i++)  // 자리수 증가 (1의 자리면 젤 큰 10의자리, 10의 자리면 그 다음 큰 10의자리... 이런 식으로)

pst2 *= POSITION;

result += (tmpNum*pst2);  // 1의자리로 만들었던 그걸 바꿀 자리수로 곱해줌

cnt--;  // 자리수 하나 감소하고

pst *= 10;  // 1의 자리 만드는 십의 자리 증가하고

pst1 *= 10;  // 나머지 구하는 십의 자리 증가하고

pst2 = 1;  // 자리수 증가하는건 다시 1로

}

if(number == result)

System.out.println(number+"은 회문수 입니다.");

else

System.out.println(number+"은 회문수가 아닙니다.");