주어진 정수가 몇 개의 자리수를 가지고 있는지를 계산하는 프로그램

쉽게 풀어쓴 C언어 Express 7장의 14번 문제를 풀어보자.


사용자가 입력한 특정한 정수의 자리수를 반대로 출력하는 프로그램을 작성하라. do...while 문을 사용하여 보라.


풀이

몇의 자리수를 입력하든 10으로 나누면 1의 자리가 나머지로 남게된다. 그럼 나머지 연산자 %를 이용해서 1의자리 숫자를 구하고, 입력받은 숫자를 10으로 나누기연산자 /를 이용해서 1의 자리를 떨어뜨린다.(오른쪽으로 한칸 씩 자리수를 옮긴다) 다시 10으로 나머지연산자 %를 이용해서 새로운 1의자리 숫자를 구하고, 10으로 나눠서 1의 자리를 바꾼다.

이것을 반복하면 뒤에서부터 숫자를 출력하기때문에 자리수를 바꿔 반대로 출력할 수 있게 된다.

코드

#include <stdio.h> 
int main(void) {

	int x, digit;

	printf("정수를 입력하시오: ");

	scanf_s("%d", &x);

	do {
		digit = x % 10;
		x /= 10;
		printf("%d", digit);
	} while (x != 0);
}

실행결과

주어진 정수가 몇 개의 자리수를 가지고 있는지를 계산하는 프로그램

266p

Programming

11. 순환 호출을 이용하여 정수의 각 자릿수를 출력하는 함수 show_digit(int x)를 작성하고 테스트하여보자. 즉, 정수가 1234이면 화면에 1 2 3 4 와 같이 출력한다. 함수는 일의 자리를 출력하고 나머지 부분을 대상으로 다시 같은 함수를 순환 호출한다. 예를 들어, 1234의 4를 출력하고 나머지 123을 가지고 다시 같은 함수를 순환 호출한다. 1234를 10으로 나누면 123이 되고 4는 1234를 10으로 나눈 나머지이다.

 #define _CRT_SECURE_NO_WARNINGS

 #include <stdio.h>

 #include <stdlib.h>  

 void show_digit(int x)

 {

if (x>=10)show_digit(x / 10);

printf("%d", x % 10);

 }

 void main()

 {

int x;

printf("정수를 입력해주세요 :");

scanf("%d", &x);

show_digit(x);

system("pause");

 }  

12. 다음을 계산하는 순환적인 프로그램을 작성하여보자.

1³+2³+3³+…+n³

 #define _CRT_SECURE_NO_WARNINGS

 #include <stdio.h>

 #include <stdlib.h>

 void main()

 {

int x,sum=0;

printf("정수를 입력해주세요 :");

scanf("%d", &x);

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

{

sum += i*i*i;

}

printf("1³+ ... +x³의 값은 %d입니다\n", sum);

system("pause");

 }


#쉽게풀어쓴c언어express #개정3판 #9장 #programming #solution

1.덧셈,뺄셈,곱셈,나눗셈을 지원하는 계싼기 프로긂을 작성하여 보자. 이번에는 각 연산들이 몇 번씩 계산되었는지를 기억하게 하자. 각 연산을 지원하는 함수들은 자신이 호출된 횟수를 화면에 출력한다.

:

#include <stdio.h>

int main()

{

static int count_p=0, count_s=0, count_m=0, count_d=0;

int a,b,i;

char mark;

while(1)

{

printf("연산을 입력하시오: ");

scanf("%d%c%d",&a,&mark,&b);

switch(mark)

{

case '+':

count_p++;

printf("덧셈은 총 %d번 실행되었습니다.\n",count_p);

printf("연산결과: %d\n",a+b);

break;

case '-':

count_s++;

printf("뺄셈은 총 %d번 실행되었습니다.\n",count_s);

printf("연산결과: %d\n",a-b);

break;

case '*':

count_m++;

printf("곱셈은 총 %d번 실행되었습니다.\n",count_m);

printf("연산결과: %d\n",a*b);

break;

case '/':

count_d++;

printf("나눗셈은 총 %d번 실행되었습니다.\n",count_d);

printf("연산결과: %lf\n",(double)a/(double)b);

break;

}

}

return 0;

}

2.주사위를 던져서 각각의 면이 몇 번 나왔는지를 출력하는 프로그램을 작성하라. 주사위릐 면은 난수를 이용하여 생성한다. 주사위를 던지는 함수 get_dice_face()를 만들고 이 함수 안에서 각각의 면이 나올 때마다 ㅡㄱ 횟수를 정적지역 변수를 이용하여 기억하게 하라, get_dice_face() 호출 횟수가 100이 되면 각 면의 횟수를 출력한다.

:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int get_dice_face(int);

int main()

{

static int one=0; static int two=0; static int three=0; static int four=0; static int five=0; static int six=0;

srand((unsigned)time(NULL));

int n,output;

for(int i=0; i<100; i++)

{

n=rand()%6+1;

output=get_dice_face(n);

if(output==1)

one++;

if(output==2)

two++;

if(output==3)

three++;

if(output==4)

four++;

if(output==5)

five++;

if(output==6)

six++;

}

printf("1-> %d\n2-> %d\n3-> %d\n4-> %d\n5-> %d\n6-> %d",one,two,three,four,five,six);

return 0;

}

int get_dice_face(int n)

{

if(n==1)

return 1;

if(n==2)

return 2;

if(n==3)

return 3;

if(n==4)

return 4;

if(n==5)

return 5;

if(n==6)

return 6;

}

3.로그인시에 아이디를 검사하는 함수 int check()를 작성해서 테스트하라. check()가 한번 호출 될 떄마다 비밀번호를 질문하고 일치 여부를 0과1으로 반환한다. 비밀번호는 숫자 1234로 고정되어 있다고 가정한다. check()가 3번 이상 호출되고 아이디가 일치하지 않으면 check()는 "로그인 시도횟수 초과" 메시지를 출력한다. check() 함수 안에 정적 변수를 선언하여 사용해보자.

:

#include <stdio.h>

int check(int key)

{

if(key==1234)

return 1;

else

return 0;

}

int main()

{

int key,answer,i;

for(i=0; i<4; i++)

{

printf("비밀번호: ");

scanf("%d",&key);

answer=check(key);

if(answer==0)

continue;

if(answer==1)

printf("로그인 성공");

break;

}

if(answer==0)

printf("로그인 횟수 초과");

return 0;

}

4.본문에서 설명한 바와 같이 정적 변수는 초기화를 딱 한번만 수행하는 경우에도 사용된다. 난수를 생성하여 반환하는 함수 get_random()을 작성하여 테스트하라. get_random()이 처음으로 호출되는 경우에는 srand()를 호출하여서 난수의 시드를 초기화하고 그렇지 않으면 단순히 rand()를 호출하여 난수를 반환한다.

:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

void get_random()

{

int r;

r=rand()%10000;

static int s=0;

if(s==0)

{ printf("초기화 실행\n");

s=1;}

else

printf("%d\n",r);

}

int main()

{

srand((unsigned)time(NULL));

get_random();

get_random();

get_random();

get_random();

return 0;

}

5.1부터 n까지의 합(1+2+3+...+n)을 계싼하는 문제를 순환기법을 이용하여 작성해보자.

:

#include <stdio.h>

int sum(int input)

{

if(input==1)

return 1;

else

return input+sum(input-1);

}

int main()

{

int input,output;

printf("정수를 입력하시오: ");

scanf("%d",&input);

output=sum(input);

printf("1부터 %d까지의 합=%d",input,output);

return 0;

}

6. 순환기법을 이용하여 지수값을 계산하는 함수 power(int base, int power_raised)를 작성하고 테스트해보자. power(2,3)가 호출되면 2^3을 계산하여 반환한다.

:

#include <stdio.h>

int powerl(int base, int power_raised)

{

if(base==1)

return 1;

if(base==0)

return 0;

if(power_raised==0)

return 1;

return base*powerl(base,power_raised-1);

}

int main()

{

int base,power;

printf("밑수: ");

scanf("%d",&base);

printf("지수: ");

scanf("%d",&power);

int output;

output=powerl(base,power);

printf("%d^%d = %d",base,power,output);

return 0;

}

7.순환 호출을 이용하여 정수의 각 자리수를 출력하는 함수 show_digit(int x)를 작성하고 테스트하라. 즉 정수가 1234이면 화면에 1 2 3 4와 같이 출력한다. 함수는 일의 자리를 출력하고 나머지 부분을 대상으로 다시 같은 함수를 순환 호출한다. 예를 들어서 1234의 4를 출력하고 나머지 123을 가지고 다시 같은 함수를 순환 호출한다. 1234를 10으로 나누면 123이 되고 4는 1234를 10으로 나눈 나머지이다.

:

#include <stdio.h>

void show_digit(int x)

{

if(x/10!=0)

{

show_digit(x/10);

printf("%d ",x%10);

}

else

printf("%d ",x);

}

int main()

{

int x;

printf("정수를 입력하시오: ");;

scanf("%d",&x);

show_digit(x);

return 0;

}

8.주어진 정수가 몇 개의 자리수를 가지고 있는지를 계산하는 츠로그램으 순환을 이용하여 작성해보자. 예를 들어서 12345의 경우에는 5가 출력된다.

:

#include <stdio.h>

int count_number(int a) { //정수의 자리 수 계산, 순환호출

int total;

static int count = 1;

int c = 10;

total = a / c;

a = total;

if (total == 0)

return count;

else

count++;

return count_number(a);

}

int main() {

printf("정수를 입력하시오: ");

int a;

scanf("%d", &a);

int output = count_number(a);

printf("자리수의 개수:%d", output);

return 0;

}

9.앞의 문제와 유산한 문제이다 자리수의 합계를 계산한는 프로그램을 순환을 이용하여 작성해보자. 예를 들어서 123의 경우에는 6이 출력된다.

:

int psum(int x)

{

int sum,m;

sum=x%10;

while(x/10!=0)

{

x=x/10;

m=x%10;

sum+=m;

}

return sum;

}

int main()

{

int input,output;

printf("정수를 입력하시오: ");

scanf("%d",&input);

output=psum(input);

printf("자리수의 합:%d",output);

return 0;

}

10. 다음과 같은 수식의 값을 계산하는 순환적인 프로그램을 작성하라.

:

#include <stdio.h>

double again(int n)

{

if(n>0)

return 1.0/n+again(n-1);

else

return 0;

}

int main()

{

int n;

printf("n 값을 입력하시오: ");

scanf("%d",&n);

printf("%lf",again(n));

return 0;

}

11.이항계수를 계산하는 순환 함수를 작성하라. 이항 계수는 다음과 같이 순환적으로 정의 된다.

:

#include <stdio.h>

int combination(int n, int k)

{

if(k==0||k==n)

return 1;

if(0<k<n)

return combination(n-1,k-1)+combination(n-1,k);

}

int main()

{

int n,k;

printf("n:");

scanf("%d",&n);

printf("k:");

scanf("%d",&k);

printf("%d",combination(n,k));

return 0;

}

12.순환 호출을 이용하여 피보나치 수열을 계산해보자. 피보나치 수열이란 다음과 같이 정의되는 수열이다.

(생략)

즉, 일반적인 경우, 앞의 두 개의 숫자를 더해서 뒤의 숫자를 만들면 된다. 정의에 따라 수열을 만들어 보면 다음과 같다.

:

#include <stdio.h>

int fib(int n)

{

if(n==0)

return 0;

if(n==1)

return 1;

else

return fib(n-2)+fib(n-1);

}

int main()

{

int n;

for(n=0; n<10; n++)

{

printf("fib(%d) = %d\n",n,fib(n));

}

return 0;

}