본문 바로가기
코딩테스트

[C언어] 소수 찾기 문제

by 얘리밍 2022. 3. 28.
320x100
728x90

문자열 숫자를 입력받아

해당 숫자로 만들 수 있는 소수를 찾는 문제 입니다.

 

(아마도 프로그래머스 2 레벨 문제..maybe) 

/**  
* 소수 찾기 문제
* 문자열 numbers가 주어졌을 때, 만들 수 있는 소수 개수 찾기
*/
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "math.h"
#define _NO_CRT_STDIO_INLINE


int biggest_number(int* arr, int length);
int get_Prime(int* arr, int num, int size);
int main()
{
	char str[7];
	int num[7] = {0,};
	int copy[7] = { 0, };
	int len = 0;
	int total_prime;
	//문자열 입력받기
	printf("input numbers : ");

	while (0 == scanf_s("%[^\n]", str, 7)) { // 길이가 0 혹은 7을 넘을 시 계속 입력받음 
		printf("숫자를 다시 입력하세요.\n");
		rewind(stdin);
		printf("input numbers : ");
	}

	len = strlen(str); //입력받은 숫자 길이
	
	// 한자리 숫자 씩 배열에 넣기
	for (int i = 0; str[i] != '\0'; i++) {
		num[i] = str[i] - '0';
	}

	memcpy(copy, num, sizeof(int)*len); 
	
	int bigNum = biggest_number(num, len);
	total_prime = get_Prime(copy, bigNum, len);
	printf("%d", total_prime);

	return 0;
}
//가장 큰수 - 내림차순 정렬
int biggest_number(int* arr,int length)
{
	int temp;
	int number = 0;
	for (int i = 0; i < length; i++) {
		for (int j = 0; j < (length - 1 - i); j++) {
			if (arr[j] < arr[j + 1]) {
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	//정수로 변환
	for (int i = 0 ; i <length; i++) {
		for (int j = 1; j < length - i; j++) {
			arr[i] *= 10;
		}
		number += arr[i];
	}
	
	return number;
}

//범위 내의 소수 판별
int get_Prime(int* arr, int num, int size)
{

	int cnt, comp;
	int check = 0, len = 0, total = 0;
	int temp[7] = {10,10,10,10,10,10,10};
	

	for (int i = 2; i <= num; i++) {
		cnt = 0;
		for (int j = 1; j <= i; j++) {
			if (i % j == 0) cnt++; //소수 아닌 수 
		}
		if (cnt == 2) { // 소수일 때
			int prime = i;
			char s1[7]; 
			int len = floor(log10(prime) + 1); //숫자 자리수 구하기
			
			sprintf_s(s1, 7, "%d", prime); //문자열 배열에 복사
			memcpy(temp, arr, sizeof(int)*size);
			
			/*해당 소수가 입력받은 숫자로 만들 수 있는 수인지 확인*/
			for (int k = 0; k < len; k++) { 
				for (int n = 0; n < size; n++) {
					comp = temp[n] + 48;
					if (s1[k] == comp) { //해당하는 문자가 있으면
						memmove(temp + n, temp + n + 1, (7-n-1)*sizeof(*temp)); //해당 문자 삭제(사용완료)
						check++; 
					}
				}
				if (check == len) total++;
			}
			check = 0;
			
			
		}
	}

	return total;
}

 

개선할 점이나 궁금한 점

댓글 환영 입니다:)

728x90
반응형