[C] 씹어먹는 C 언어 - <7. for, while >

Kim Dongil·2022년 10월 17일
0

C

목록 보기
12/28

문제 1. N 줄인 삼각형을 출력한다. 단, 사용자로 부터 임의의 N 을 입력 받는다. 아래는 N = 3 일 때의 출력 예시 이다. (난이도 : 中)

#include <stdio.h>

int main()
{
	int i, j, k, n;

	printf("몇 줄인 삼각형을 원하는가? \n");
	scanf_s("%d", &n);

	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n-i; j++)
		{
			printf(" ");
		}

		for (k = 0; k < i * 2 + 1; k++)
		{
			printf("*");
		}
		printf("\n");
	}

	return 0;
}

문제 2. 위와 동일한 형태를 취하되, 역 삼각형을 출력한다. 아래는 N = 3 일 때의 출력 예시 이다. (난이도 : 中上)

#include <stdio.h>

int main()
{
	int i, j, k, n;

	printf("몇 줄인 삼각형을 원하는가? \n");
	scanf_s("%d", &n);

	for (i = 1; i <= n; i++)
	{
		for (j = 0; j < i; j++)
		{
			printf(" ");
		}

		for (k = 0; k < (n -i) * 2 + 1; k++)
		{
			printf("*");
		}
		printf("\n");
	}

	return 0;
}

문제 3. 1000 이하의 3 또는 5 의 배수인 자연수들의 합을 구한다.(난이도 : 下)

#include <stdio.h>

int main(void)
{
	int i;
	int sum = 0;

	for (i = 0; i <= 1000; i++)
	{
		if (i % 3 == 0 || i % 5 == 0)
		{
			sum += i;
		}
	}

	printf("%d", sum);


	return 0; // 정답 234168
}

문제 4. 1000000 이하의 피보나치 수열 ( N 번째 항이 N - 1 번째 항과 N - 2 번째 항으로 표현되는 수열, 시작은 1,1,2,3,5,8,...) 의 짝수 항들의 합을 구한다 !!!!!! (짝수번째 항 x 숫자가 짝수인 항들의 합) !!!!!! (난이도 : 中)

#include <stdio.h>

int main(void)
{
	int f1 = 1, f2 = 1;
	int sum = 0;
	int total = 0;

	while(sum<=1000000)
	{
		if (sum % 2 == 0)
		{
			total += sum;
		}

		sum = f1 + f2;
		f1 = f2;
		f2 = sum;

	}
	printf("1000000 이하의 피보나치 수열중 짝수인 값의 합 : %d \n", total); 

	return 0;
}

어려워서 다른 분들 코드를 보면서 이해하려 하는데 다들 코드가 다르기도 하고 짝수 번째 항을 합하는 건지 짝수인 숫자를 합하는 건지 헷갈리기도 해서 아주 어려웠다. (1시간 정도 들인 듯.....)

피보나치 수열 : 1 1 2 3 5 8 13 21 34 55 ...
ex : 1 + 1 = 2 , 1 + 2 = 3
즉 n번째 항 더하기 n+1번째 항 = n+2번째 항

문제 5. 사용자로 부터 N 값을 입력 받고 1 부터 N 까지의 곱을 출력한다. (난이도 : 下)

(n 값을 5라고 한다면 1 x 2 x 3 x 4 x 5 = 120 이다 )

#include <stdio.h>

int main(void)
{
	int i, n;
	int result = 1;

	printf("n 값 입력: ");
	scanf_s("%d", &n);
	
	for (i = 1; i <= n; i++)
	{
		result *= i;
	}
	printf("\n\n1 부터 입력받는 n 까지의 곱 = %d \n", result);

	return 0;
}

문제 6. 다음 식을 만족하는 자연수 a,b,c 의 개수를 구하여라 (난이도 : 中)

#include <stdio.h>

int main(void)
{
	int a, b, c;
	int sum = 0;

	for (a = 1; a < 2000; a++)
	{
		for (b = 1; b < a; b++)
		{
			for (c = 1; c < b; c++)
			{
				if (a + b + c == 2000)
				{
					sum++;
				}
			}
		}
	}
	printf("%d", sum);

	return 0;
}

문제 7. 임의의 자연수 N 을 입력 받아 N 을 소인수 분해 한 결과를 출력하여라. 예를 들어서 N = 18 일 경우

#include <stdio.h>

int main()
{
	int i, n;
	printf("소인수 분해 시킬 자연수 입력 : ");
	scanf_s("%d", &n);
	printf("\nn = %d  %d = ", n, n);

	for (i = 2; i <= n; i++)
	{
		if (n % i == 0)
		{
			n /= i;
			printf("%d ", i);
			i = 1;

			if (n != i)
			{
				printf("* ");
			}
		}
	}

	return 0;
}

혼자서 고민하고 또 고민해도 답이 안나와서 다른 사람들의 풀이를 보았지만 그럼에도 이해가 잘 안됐다
자꾸만 머릿속으로 대충 암산하고 이해해보려고 하는 나쁜 버릇이 있어서
마음먹고 공책을 펴서 하나하나 써보면서 이해하려고 하니까 이해가 됐다.

문제 8. 문제 7 에서 만든 프로그램의 속도를 향상 시킬 수 있는 방법은 없을까? 큰 수를 빠르게 소인수분해 할 수 있는 방법들을 찾아 프로그램에 적용시켜 보아라. 예를 들어서 N 의 제곱근 이하의 정수들만 처리한다던지, Lucas- Lehmer 판정법을 이용해 소수인지 아닌지 판정한다던지 등등..

8번 포기.. 아시는분 설명해주시면 감사하겠습니다

씹어먹는 C 언어 - <7. 뱅글 뱅글 (for, while) >

0개의 댓글