U E D R , A S I H C RSS

Carmichael Numbers/조현태

�낀� � 설명

�단 소수�면 안�기 때문� 살�시 저번� FactorialFactors �서 사용했� 알고리즘� 사용해서 단시간� 소수�지 확�하�� 하였다.
그리고 CarmichaelNumbers가 뭔지 몰�서..�터넷�서 뒤져본 결과 최소 3개 ��� 소수� 곱�었� 관계로 그 부분� 추가해 주었다.
마지막으로.. 심심 하면 새침한 표정으로 나타나는 변수�기 초과오류 아가씨..
� 아가씨를 달래기 위해.. 그간 굴리지 않아서 녹��서 안�아가는 머리를 굴려 약간� 수학� 계산� ��해서..
아가씨가 입� 수 있는 �기� 숫�가 나머지로 나오�� 해주었다. 다행히 주어진 숫�� 범위가 �지않아 예� 숫�들� 범위�서 �났다고나 할까..
대신 연산� �려지긴 했겠지만 �.. 범위가 작� 관계로 입력하면 바로바로 나와주는 쎈쓰~! 그래서 별로 신경쓰지는 않았다.
�정�면 충분 하려나.. 그럼 좋�하루!!^^*

소스

~cpp 
#include <stdio.h>
#include <iostream>

const int MINIMUM=2;
const int MAXIMUM=65000;

int Carmichael(int);
int Sosu(int);

void main()
{
	while (1)
	{
		printf("숫�를 입력해 주세요.\n");
		int number=-1;
		int answer=0;
		while ((0!=number)&&(number<MINIMUM || MAXIMUM<number))
			scanf("%d",&number);
		if (0==number)
			break;
		answer=Carmichael(number);
		if (0==answer)
			printf("%d is normal.\n",number);
		else 
			printf("The number %d is a Carmichael number.\n",number);
	}
}

int Carmichael(int number)
{
	if (0!=Sosu(number))
		return 0;
	for (register int i=2; i<number; ++i)
	{
		unsigned int a=1;
		for (register int j=0; j<number; ++j)
		{
			a*=i;
			a%=number;
		}
		if (i!=a)
			return 0;
	}
	return 1;
}

int Sosu(int number)
{
	if (2==number || 3==number)
		return 1;
	int *log_number=(int*)malloc((number+2)*sizeof(int)); 
	int gab; 
	log_number[2]=1; 
	log_number[3]=0; 
	for (register int i=4; i<=number;i+=2) 
	{ 
		log_number[i]=1; 
		log_number[i+1]=0; 
	} 
	for (register int i=3; i<=number; ++i) 
	{ 
		if (0==log_number[i]) 
		{ 
			if (i==number)
			{
				free(log_number); 
				return 1;
			}
			log_number[i]=1; 
			gab=i+i; 
			for(register int j=i+gab; j<=number; j+=gab) 
				++log_number[j]; 
		} 
	} 
	if (log_number[number]<3)
	{
		free(log_number);
		return 2;
	}
	free(log_number);
	return 0; 
}

저�게 할�

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:49
Processing time 0.0038 sec