== ì†Œê° == 숫ìžê°€ 지대 í¬ë‹¤. ê°ë‹¹ì´ 안ëœë‹¤..ã… .ã…œ 사실 하ë¼ë©´ ëª»í• ê²ƒë„ ì—†ì§€ë§Œ, ìž…ë ¥ 형ì‹ê³¼ ì¶œë ¥ 형ì‹ë“±ì„ 새로 ì§œë‚´ê³ , ë§ì…ˆë° ê³±ì…ˆì—°ì‚°ì„ ë‹¤ì‹œì§œì£¼ë©´ 간단히(?)í•´ê²°ëœë‹¤. 하지만 ì§€ê¸ˆì€ ì¼í•´ì•¼ í•˜ê¸°ë•Œë¬¸ì— ì‹œê°„ì´ ë¶€ì¡±í•œ 관계로.. 임시로 ë’¤ì— ë‘ ìˆ«ìžëŠ” 해결하지 못하는 소스를 ì§œë‘었다. ë‚´ì¼ì´ë‚˜ ëª¨ë ˆ ìˆ˜ì • ë° ë³´ì™„í•´ì„œ ë‘ê°œ 다 풀수 있ë„ë¡ ë§Œë“¤ê² ë‹¤. // ê°’ì„ ìž…ë ¥ë°›ì„때, ë‘ ê°’ì˜ ìž…ë ¥ìˆœì„œë¥¼ 바꿔 놓았는ë°, ê·¸íŽ¸ì´ ì¢€ë” ì•ˆì •ì ì´ë¼ëŠ” 단순한 ì´ìœ 때문.. 회사ì—서 ì´ëŸ°ì§“ 하면 ì§¤ë¦¬ë ¤ë‚˜?ã…Žã…Žã…Ž ë‘번째 소스.. 숫ìžê°€ ì»¤ë„ ì €ìž¥í•˜ê³ ì—°ì‚°í• ìˆ˜ 있ì„...듯 하다..;;ã…;; ã…Žã…Žã…Ž MAX_LONGì˜ ê°’ì„ 10으로 줄ì´ê³ 테스트를 해서 2ê°œ ì´ìƒì˜ 경우ì—ë„ ëŒì•„가는 ê²ƒì€ ì•Œê² ëŠ”ë°... 3번째 4번째 ì˜ˆì œì˜ ìˆ˜ê°€ ì›ì²´ 커야지 ë§ì´ë‹¤. ì—°ì‚°ì˜ ê²°ê³¼ê°€ 좀처럼 안나온다. 곱하기 루틴ì—서 ê³„ì† ë”í•˜ê³ ìžˆëŠ”ë“¯..;;ã…;; ìŒ.. ë‹¤ë¥¸ë°©ë²•ì„ ì°¾ì•„ì•¼ 하나.^^; == 소스 == {{{~cpp #include <iostream> using namespace std; const int TRUE=1; const int FALSE=0; unsigned __int64 such_target_number(unsigned __int64 mokpyo, unsigned __int64 gaesu) { unsigned __int64 min_answer=1, max_answer=mokpyo+1; while (min_answer+1!=max_answer) { unsigned __int64 temp_target=(min_answer+max_answer)/2; unsigned __int64 temp_result=1; for (register unsigned __int64 i=0; i<gaesu; ++i) temp_result*=temp_target; if (temp_result>mokpyo) max_answer=temp_target; else if (temp_result<mokpyo) min_answer=temp_target; else return temp_target; } return FALSE; } void main() { cout << "ê²°ê³¼ê°’ì— 1ì„ ìž…ë ¥í• ê²½ìš° í”„ë¡œê·¸ëž¨ì´ ë납니다.\n"; while (1) { unsigned __int64 intput_number=0; cout << "ì œê³±í•œ ê²°ê³¼ê°’ì„ ìž…ë ¥í•´ì£¼ì„¸ìš”. >>"; while (intput_number<1) scanf("%I64d",intput_number); if (1==intput_number) break; unsigned __int64 gob_gaesu=0; cout << "ì œê³±í•œ 회수를 ìž…ë ¥í•´ì£¼ì„¸ìš”. >>"; while (intput_number<gob_gaesu || gob_gaesu<1) scanf("%I64d",gob_gaesu); unsigned __int64 answer=such_target_number(intput_number,gob_gaesu); if (FALSE==answer) cout << "ìž˜ëª»ëœ ê°’ì„ ìž…ë ¥í•˜ì˜€ìŠµë‹ˆë‹¤.\n"; else cout << "ê²°ê³¼ê°’ì€ " <<answer << " 입니다.\n"; } cout << "ì´ìš©í•´ì£¼ì…”서 ê°ì‚¬í•©ë‹ˆë‹¤.\n"; } }}} === ë‘번째 소스 === {{{~cpp #include <iostream> #include <conio.h> using namespace std; const int TRUE=1; const int FALSE=0; const int ENTER=13; const unsigned __int64 MAX_LONG=1000000000000000000; class save_number{ private: unsigned __int64 number; save_number *next; save_number *prv; public: save_number(int input_number, save_number *who_next) { number=input_number; next=who_next; prv=NULL; if (NULL!=who_next) who_next->link(this); } save_number(save_number *input_number, save_number *who_next) { number=0; next=who_next; prv=NULL; if (NULL!=who_next) who_next->link(this); plus_number(input_number); } ~save_number() { if (prv!=NULL) delete prv; } void link(save_number *new_prv) { prv=new_prv; } save_number *get_prv() { return prv; } save_number *get_next() { return next; } void ollim() { if (prv!=NULL) { prv->number_input(number/MAX_LONG); number%=MAX_LONG; } else { prv=new save_number(number/MAX_LONG,this); number%=MAX_LONG; } } void plus_ollim() { if (prv!=NULL) { prv->plus_number_unsigned(number/MAX_LONG); number%=MAX_LONG; } else { prv=new save_number(number/MAX_LONG,this); number%=MAX_LONG; } } int number_input(int input_number) { if (input_number>9 || input_number<0) return FALSE; number*=10; number+=input_number; if (number>=MAX_LONG) ollim(); return TRUE; } unsigned __int64 call_number(int where_number) { if (0==where_number) return number; if (prv==NULL) return MAX_LONG; return prv->call_number(where_number-1); } void plus_number_unsigned(unsigned __int64 plus_input_number) { number+=plus_input_number; if (number>=MAX_LONG) plus_ollim(); } int plus_number(int plus_input_number) { if (plus_input_number<0) return FALSE; plus_number_unsigned( plus_input_number); return TRUE; } void plus_number(save_number *plus_target) { save_number *target=this; register int i=0; unsigned __int64 get_number; while (1) { get_number=plus_target->call_number(i); if (MAX_LONG==get_number) break; this->plus_number_unsigned(get_number); if (target->get_prv()==NULL) break; target=target->get_prv(); ++i; } while (1) { ++i; get_number=plus_target->call_number(i); if (MAX_LONG==get_number) break; target=new save_number(get_number,target); } } int compare_number(unsigned __int64 target_number) { if (number<target_number) return 1; if (number>target_number) return -1; return 0; } int compare_number(save_number *target_number) { register int i=0; unsigned __int64 this_number=0; unsigned __int64 taget_get_number=0; while (this_number!=MAX_LONG) { if (taget_get_number==MAX_LONG) return -1; this_number=call_number(i); taget_get_number=target_number->call_number(i); ++i; } if (taget_get_number!=MAX_LONG) return 1; while (1) { this_number=call_number(i); taget_get_number=target_number->call_number(i); if (this_number==taget_get_number && 0==i) return 0; this_number%=MAX_LONG; taget_get_number%=MAX_LONG; if (this_number<taget_get_number) return 1; if (this_number>taget_get_number) return -1; --i; } } int nanugi_2() { if (NULL!=prv) { if (1==prv->nanugi_2()) number+=MAX_LONG; if (0==prv->call_number(0)) { delete prv; prv=NULL; } } if (1==number%2) { number/=2; return 1; } number/=2; return 0; } }; void print_number(save_number *target) { save_number *temp_number=target; while(NULL!=temp_number->get_prv()) temp_number=temp_number->get_prv(); while (NULL!=temp_number) { cout << temp_number->call_number(0); temp_number=temp_number->get_next(); } } save_number *such_target_number(save_number *mokpyo, save_number *gaesu) { save_number *min_answer, *max_answer, *temp; int result_compare; min_answer=new save_number(1,NULL); max_answer=new save_number(mokpyo,NULL);max_answer->plus_number(1); temp=new save_number(min_answer,NULL);temp->plus_number(1); result_compare=temp->compare_number(max_answer); delete temp; while (0!=result_compare) { save_number *temp_target, *temp_result; temp_target=new save_number(min_answer,NULL); temp_target->plus_number(max_answer);temp_target->nanugi_2(); temp_result=new save_number(1,NULL); save_number *i=new save_number(0,NULL); while(0!=i->compare_number(gaesu)) { save_number *j=new save_number(1,NULL); save_number *temp_plus=new save_number(temp_result,NULL); while (0!=j->compare_number(temp_target)) { temp_result->plus_number(temp_plus); j->plus_number(1); } delete j; delete temp_plus; i->plus_number(1); } delete i; int result_compare_second=temp_result->compare_number(mokpyo); if (-1==result_compare_second) { delete max_answer; max_answer=new save_number(temp_target,NULL); } else if (1==result_compare_second) { delete min_answer; min_answer=new save_number(temp_target,NULL); } else { delete min_answer;delete max_answer;delete temp_result; return temp_target; } temp=new save_number(min_answer,NULL);temp->plus_number(1); result_compare=temp->compare_number(max_answer); delete temp; } return NULL; } void main() { save_number *intput_number, *gob_gaesu; intput_number=new save_number(0,NULL); gob_gaesu=new save_number(0,NULL); char temp=0; cout << "ì œê³±í•œ ê²°ê³¼ê°’ì„ ìž…ë ¥í•´ì£¼ì„¸ìš”. >>"; while (ENTER!=temp) { temp=getch(); if (47<temp && 58>temp) { intput_number->number_input(temp-48); cout << temp; } } temp=0; cout << "\n"; cout << "ì œê³±í•œ 회수를 ìž…ë ¥í•´ì£¼ì„¸ìš”. >>"; while (ENTER!=temp) { temp=getch(); if (47<temp && 58>temp) { gob_gaesu->number_input(temp-48); cout << temp; } } cout << "\n"; save_number *answer=such_target_number(intput_number,gob_gaesu); if (NULL==answer) cout << "ìž˜ëª»ëœ ê°’ì„ ìž…ë ¥í•˜ì˜€ìŠµë‹ˆë‹¤.\n"; else { cout << "ê²°ê³¼ê°’ì€ "; print_number(answer); cout << " 입니다.\n"; delete answer; } cout << "ì´ìš©í•´ì£¼ì…”서 ê°ì‚¬í•©ë‹ˆë‹¤.\n"; } }}} == 나ì—게 í• ë§ == int í˜•ì„ 64비트로 했군. -_-. ìƒê°í•´ë³´ìž. 파ì´ì¬ì²˜ëŸ¼ ê±°ì˜ ë¬´í•œëŒ€ìžë¦¬ê¹Œì§€ ì—°ì‚°í•˜ë ¤ë©´ 어떻게 í•´ì•¼í• ê¹Œ??? - [ì´ì˜í˜¸] └간단하게 파ì´ì¬ì´ëž‘ 결합하면 ë˜ìš”오오~~>ã…ƒ<;;; ã…Žã…Žã…Žã…Ž í•„ìš”í• ë•Œë§ˆë‹¤ malloc으로 í• ë‹¹í•˜ê³ í¬ì¸í„°ë¡œ 넘겨서 연산하는 ë°©ë²•ì´ ìžˆìŠµë‹ˆë‹¤ë§Œ....(귀찮다...귀찮다..귀찮다..윽.. ì´ê²Œ 아니잖아!!) -[조현태] â””ìŒ... 그거 ë‚´ê°€ ê³ ë“±í•™êµë•Œ 짜다가 í¬ê¸°í–ˆë˜ 방법ì´ë„¤ ã…‹ã…‹ã…‹ ë‚˜ì¤‘ì— ê°€ë‹ˆ 꽤나 ë³µìž¡í•´ì ¸ì„œ... 암튼 ìš”ì¦ˆìŒ ë°©ë²•ìœ¼ë¡œëŠ”... __int64 를 만드는 방법으로... assembly를 ì´ìš©í•˜ë©´ ì—„ì² ê°„ë‹¨í•´ì§€ë”êµ° -_-... 한번 ê³µë¶€í•˜ê³ ë§Œë“¤ì–´ë´... C언어ì—서 ì¸ë¼ì¸ ì–´ì…ˆ ì¨ì„œ 함수 ë§Œë“¤ì–´ë‘ ì¢‹êµ¬. 아래 ì°¸ê³ . - [ì´ì˜í˜¸] {{{~cpp -----------c언어 소스------- 2982: __int64 a,b; 2983: 2984: a = 0xffffffffffffffff; 2985: b = a-1; ----------디셈블리소스------ 00415183 mov dword ptr [a],0FFFFFFFFh 0041518A mov dword ptr [ebp-4],0FFFFFFFFh 00415191 mov eax,dword ptr [a] 00415194 sub eax,1 00415197 mov ecx,dword ptr [ebp-4] 0041519A sbb ecx,0 0041519D mov dword ptr [b],eax 004151A0 mov dword ptr [ebp-0Ch],ecx }}} ;;ã…;; ìŒ.. ì˜í˜¸ì„ 배는 넘í 마니 ì•Œê³ ì´ì©¡..>ã…ƒ<;; C언어 소스 ë´ë„ ëª¨ë¥´ê²Œë– ìš©..ã…Žã…Ž 64ë¹„íŠ¸í˜•ì˜ ì¸íŠ¸í˜•ì˜ ë³€ìˆ˜ë¥¼ ë‘ê°œ ì§€ì •í•˜ê³ aì—다가 최대값ì„..(아마 부호가 있기 ë•Œë¬¸ì— -1ì €ìž¥됬ì„듯한..)ë„£ê³ bì—는 a-1ì„.. 그럼 -2ê°€ ì €ìž¥..;; ìŒ.. ì´ê²Œ ì•„ë‹ˆë¼ í˜¹ì‹œ bê°€ í¬ì¸í„°ë¼ì„œ 메모리 한칸 ì•žìª½ì„ ìž¡ì•„ì£¼ëŠ” 건가요? ìŒ.. 그러면 í• ë‹¹ë˜ì§€ì•Šì€ 메모리를 건드는 사태가..;;ã…;; ì´ê²ƒë„ 아닌가.. 연구를..;;ã…;; - [조현태] ---- [PowerOfCryptography] [LittleAOI]