ëŠ�ë‚€ì � ë°� 설명 ¶
ì�¼ë‹¨ 소수ì�´ë©´ 안ë�˜ê¸° 때문ì—� ì‚´í�¬ì‹œ ì €ë²ˆì—� FactorialFactors ì—�서 사용했ë�˜ ì•Œê³ ë¦¬ì¦˜ì�„ 사용해서 단시간ì—� 소수ì�¸ì§€ 확ì�¸í•˜ë�„ë¡� 하였다.
ê·¸ë¦¬ê³ CarmichaelNumbersê°€ ë”ì§€ 몰ë�¼ì„œ..ì�¸í„°ë„·ì—�서 ë’¤ì ¸ë³¸ ê²°ê³¼ 최소 3ê°œ ì�´ìƒ�ì�˜ 소수ì�˜ ê³±ì�´ì—ˆë�˜ 관계로 ê·¸ 부분ë�„ 추가해 주었다.
마지막으로.. 심심 하면 새침한 í‘œì •ìœ¼ë¡œ 나타나는 변수í�¬ê¸° 초과오류 아가씨..
ì�´ 아가씨를 달래기 위해.. 그간 굴리지 않아서 ë…¹ì�´ì�¨ì„œ 안ë�Œì•„가는 머리를 êµ´ë ¤ 약간ì�˜ 수학ì � 계산ì�„ ë�™ì›�해서..
아가씨가 ìž…ì�„ 수 있는 í�¬ê¸°ì�˜ 숫ìž�ê°€ 나머지로 나오ë�„ë¡� 해주었다. 다행히 주어진 숫ìž�ì�˜ 범위가 í�¬ì§€ì•Šì•„ 예ì�œ 숫ìž�들ì�˜ 범위ì—�서 ë��ë‚¬ë‹¤ê³ ë‚˜ í• ê¹Œ..
ëŒ€ì‹ ì—°ì‚°ì�´ ëŠ�ë ¤ì§€ê¸´ í–ˆê² ì§€ë§Œ ë�.. 범위가 ìž‘ì�€ 관계로 ìž…ë ¥í•˜ë©´ 바로바로 나와주는 쎈쓰~! 그래서 별로 ì‹ ê²½ì“°ì§€ëŠ” 않았다.
ì�´ì •ë�„ë©´ ì¶©ë¶„ í•˜ë ¤ë‚˜.. 그럼 좋ì�€í•˜ë£¨!!^^*
ê·¸ë¦¬ê³ 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;
}










