트랙백 주소 : http://djinn.egloos.com/tb/1253521 ☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 큰정수 at 2009/03/23 02:48
#include <iostream> #include <string> #define DIGIT 300 // 자리수 LIMIT #define THRESHOLD 3 #define MAXIMUM(a, b) a>=b ? a : b #define MINIMUM(a, b) a< b ? a : b using namespace std;
typedef struct L_Int // L_Int 형 정의 { char n[DIGIT]; // 배열에는 숫자가 거꾸로 저장된다. bool p; // true -> 음수 , false -> 양수 } L_Int;
int NumberDigit(L_Int x); // 자리수 구하기 void Init(L_Int &x); // 초기화 void input(L_Int &x, L_Int &y); // 입력, reverse(배열) void print(L_Int x); // reverse(배열), 출력 void Reverse(L_Int &u); // 배열 뒤집기 bool Compare(L_Int u, L_Int v);// 크기 비교, u가 크면 true
L_Int Divide (L_Int u, int m); // Divide u by 10^m L_Int Rem (L_Int u, int m); // Remain u by 10^m L_Int Plus (L_Int u, L_Int v); // u + v L_Int Minus (L_Int u, L_Int v);// u - v L_Int Mul (L_Int u, int m);// u를 10^m 만큼 곱하기 L_Int Mul2 (L_Int u, int m);// u를 10^2m 만큼 곱하기 L_Int Mul_Usual (L_Int u, L_Int v); // 일반적 방법으로 두 수 곱하기 L_Int CheckDigit (L_Int u);// 배열 제일 큰 자리수가 0일 때 자리수 조정하기 L_Int Prod2 (L_Int u, L_Int v);// 큰 수의 곱셈 main 알고리즘
void main() { L_Int a, b, x; Init(a);Init(b);Init(x);
cout<<"두 개의 큰 정수를 입력하십시오."<<endl;
input(a, b); print(a); print(b); cout<<"Digit : "<<NumberDigit(a)<<NumberDigit(b)<<endl; cout<<"Plus result :"<<Plus(a, b)<<endl; cout<<"Multiplication Usual Way : "<<Mul_Usual(a, b)<<endl; cout<<"Prod2 result : "<<Prod2(a, b)<<endl; }
L_Int Prod2(L_Int u, L_Int v){// 큰 수의 곱셈 main 알고리즘 L_Int x, y, w, z, r, p, q, result; Init(x); Init(y); Init(w); Init(z); Init(r); Init(p); Init(q); Init(result);
else { m = (int)(n/2 + 0.5); x = Divide(u, m); y = Rem(u, m); w = Divide(v, m); z = Rem(v, m); r = Prod2( Plus(x, y), Plus(w, z)); p = Prod2( x, w ); q = Prod2( y, z ); return Plus( Plus( Mul2(p, m), Mul( Minus( Minus(r, p), q ), m ) ) , q); }
}
int NumberDigit(L_Int x){ // 자리수 구하기 int counter=0;
void input(L_Int &x, L_Int &y){ //입력받고 쉬운 계산을 위해 배열 거꾸로 돌리줌 cin>>x.n>>y.n>>endl; Reverse(x); Reverse(y); }
void print(L_Int x){ // 거꾸로 돌리고 출력 Reverse(x); cout<<x.n<<endl; }
L_Int Plus(L_Int u, L_Int v){ // u + v L_Int result; Init(result); int digitU = NumberDigit(u); int digitV = NumberDigit(v); int small = MINIMUM( digitU, digitV ); int large = MAXIMUM( digitU, digitV ); int up=0; // 자리수 올릴 때 쓰는 임시변수
for( int i = 0 ; i <= large-1 ; i++) { if( i == 0) // 첫루프 때만, 마지막 자리수에 NULL 입력 result.n[large] = NULL;
L_Int Minus(L_Int u, L_Int v){ // u - v , ( u >= v ) L_Int result; Init(result); int digitU = NumberDigit(u); int digitV = NumberDigit(v); int small = MINIMUM( digitU, digitV ); int large = MAXIMUM( digitU, digitV ); int down=0; // 자리수 내릴 때 쓰는 임시변수 bool comp; comp = Compare(u, v);
if( comp == true ) //u 가 v 보다 크면 {
for( int i = 0 ; i <= large-1 ; i++) { if( i == 0) // 첫 루프일때만, 마지막 자리수에 NULL result.n[large] = NULL;
result.n[i] = u.n[i] - v.n[i] + 48; if( i >=small ) // 작은 수의 자리수보다 커지면 result.n[i] -= 48; // 아스키값
result.n[i] += down; down = 0;
if( result.n[i] < '0' ) { result.n[i] += 10; down--; } if( i == large-1 ) // 마지막 연산이면 result.n[i+1] += down; } } else // u 가 v 보다 작으면 { result=Minus(v, u); // 거꾸로 계산한 후 result.p = true; // 음수표기 return result; }
result = CheckDigit(result); return result; }
L_Int Mul_Usual(L_Int u, L_Int v){ // 일반적 방법으로 두 수 곱하기 L_Int result; Init(result); int a, b, temp;
Reverse(u); // 일단 뒤집고 Reverse(v); a = atoi(u.n); // 문자열 -> 숫자 b = atoi(v.n); temp = a*b;
itoa(temp, result.n, 10); Reverse(result); // 또 뒤집고 result = CheckDigit(result); return result; }
L_Int CheckDigit(L_Int u){ // 배열 제일 오른쪽 큰 자리수가 0일 때 자리수 조정하기(EX : 123000 -> 123 ) L_Int result; int digit = NumberDigit(u); result = u;
for( int i = digit-1 ; i>0 ; i--) { if(result.n[i] == '0') result.n[i] = NULL; else break;
bool Compare(L_Int u, L_Int v){// 크기 비교, u가 크면 true L_Int a, b; a = u; b = v; a = CheckDigit(a); b = CheckDigit(b); int digitU = NumberDigit(a); int digitV = NumberDigit(b);
long* i_to_p(char p[]){ //주어진 수식을 후위식으로 변환하는 함수
int count=0;
char ch,top_op;
stack<char> *s=new stack<char>;
int len = strlen(p);
long *result=new long;
아직 수정중 정리가 덜됬음
요즘생각
왜 사람의 다리는 두 짝인가?
사람이 걸어가는데 필요한것은 좌우의 균형과 협동일 것이다
사람들은 흔히 왼발과 오른발의 길이가 같은줄 알것이다.
하지만 사람의 신체에서 왼손과 오른손의 길이는 다르며, 왼발과 오른발도 어느쪽이 더 익숙하냐에 따라 한쪽발이 조금 더 긴것은 사실이다.
하지만 일반 사람들은 그 차이가 있는지도 느끼지 않으며 하루에도 수백 수천번을 걷는다.
사람들의 걸음걸이를 보면 족적의 방향에 따라서 크게 두가지로 나눈다면 모델의 걸음걸이와 팔자걸음이 있다.
모델의 걸음걸이는 왼발과 오른발이 몸이 나아가고자 하는 방향인 중앙을 향해 경쟁하듯 모이며 나아간다.
왼발은 나아가 오른발의 앞을, 오른발은 왼발의 앞을 막는듯이 보인다.
하지만 왼발이든 오른발이든 골반을 이용하여 다음 걸음을 위해서 비켜날줄 안다.
팔자걸음은 모델의 걸음과는 다르게 양 발은 서로를 철천지 원수인양 마주보기도 싫은듯 멀어지고 모델의 걸음과 다르게 자신의 방향을 나아가고 중앙으로 모이질 않는다. 하지만 서로가 향하는것은 정면, 자신의 방향을 고집하지만 그보다 더 앞을 향한다.
당신에게 위의 두 걸음걸이중에 하나만 옳고 다른것은 틀렸다고한다면 당신은 어떤 생각을 하십니까?
이전의 세대에서야 남자는 팔자걸음 여자는 조신스럽게 모델걸음을 해야 옳다고 했지만 시대가 변하고 가치관이 변했다는건 누구나 공감할 것이다.
자신의 뻗음이 어디까지 인지 얼마큼인지를 알고, 자신의 반쪽을 위해 멈추고 기다려줄줄 안다는 것이다.