소ê°� ¶
숫ìž�ê°€ 지대 í�¬ë‹¤. ê°�당ì�´ 안ë�œë‹¤..ã… .ã…œ
사실 하ë�¼ë©´ ëª»í• ê²ƒë�„ 없지만, ìž…ë ¥ 형ì‹�ê³¼ ì¶œë ¥ 형ì‹�등ì�„ 새로 ì§œë‚´ê³ , ë�§ì…ˆë°� 곱셈연산ì�„ 다시짜주면 간단히(?)í•´ê²°ë�œë‹¤.
하지만 지금� �해야 하기때문� 시간� 부족한 관계로..
임시로 뒤� � 숫�는 해결하지 못하는 소스를 짜�었다.
ë‚´ì�¼ì�´ë‚˜ ëª¨ë ˆ ìˆ˜ì • ë°� 보완해서 ë‘�ê°œ 다 풀수 있ë�„ë¡� ë§Œë“¤ê² ë‹¤.
사실 하ë�¼ë©´ ëª»í• ê²ƒë�„ 없지만, ìž…ë ¥ 형ì‹�ê³¼ ì¶œë ¥ 형ì‹�등ì�„ 새로 ì§œë‚´ê³ , ë�§ì…ˆë°� 곱셈연산ì�„ 다시짜주면 간단히(?)í•´ê²°ë�œë‹¤.
하지만 지금� �해야 하기때문� 시간� 부족한 관계로..
임시로 뒤� � 숫�는 해결하지 못하는 소스를 짜�었다.
ë‚´ì�¼ì�´ë‚˜ ëª¨ë ˆ ìˆ˜ì • ë°� 보완해서 ë‘�ê°œ 다 풀수 있ë�„ë¡� ë§Œë“¤ê² ë‹¤.
// ê°’ì�„ ìž…ë ¥ë°›ì�„때, ë‘� ê°’ì�˜ ìž…ë ¥ìˆœì„œë¥¼ 바꿔 놓았는ë�°, 그편ì�´ 좀ë�” ì•ˆì •ì �ì�´ë�¼ëŠ” 단순한 ì�´ìœ 때문..
회사ì—�서 ì�´ëŸ°ì§“ 하면 ì§¤ë¦¬ë ¤ë‚˜?ã…Žã…Žã…Ž
ë‘�번째 소스.. 숫ìž�ê°€ 커ë�„ ì €ìž¥í•˜ê³ ì—°ì‚°í• ìˆ˜ 있ì�„...듯 하다..;;ã…�;; ã…Žã…Žã…Ž 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언어ì—�서 ì�¸ë�¼ì�¸ ì–´ì…ˆ ì�¨ì„œ 함수 만들어ë‘� 좋구. 아래 ì°¸ê³ . - ì�´ì˜�호
한번 ê³µë¶€í•˜ê³ ë§Œë“¤ì–´ë´�... 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ê°€ í�¬ì�¸í„°ë�¼ì„œ 메모리 한칸 앞쪽ì�„ 잡아주는 건가요? ì�Œ.. 그러면 í• ë‹¹ë�˜ì§€ì•Šì�€ 메모리를 건드는 사태가..;;ã…�;; ì�´ê²ƒë�„ 아닌가.. 연구를..;;ã…�;; - 조현태










