* 입력받는 문자열은 char* 형식의 상수형 문자열로 가정한다.
* 숫자의 크기는 int 형 크기만큼 가정한다.
pow() 함수를 이용했는데 관련 레퍼런스는 :
http://stackoverflow.com/questions/13418180/time-complexity-of-c-math-library-pow-function
아스키코드 관련 : https://mirror.enha.kr/wiki/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C
p.s. 입력받은 문자를 아스키 문자로 변경할때는 해당 문자를 48로 %하여 나머지값으로 계산을 하면된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136 | #include <iostream>
using namespace std;
int StringToInteger(const char* srcString);
int AsciiToInteger(const char asciiChar);
void IntegerToString(int number, char** numberString);
void main()
{
int answer = StringToInteger("-2123");
cout << answer << endl;
char* testString = nullptr;
IntegerToString(answer, &testString);
cout << testString << endl;
system("pause");
}
void IntegerToString(int number, char** numberString)
{
bool minusFlag = false;
if (number < 0)
{
minusFlag = true;
number *= -1;
}
int dividedNumber = number;
int digits = 0;
while (dividedNumber > 0)
{
dividedNumber = dividedNumber / 10;
digits++;
}
int endPos = 0;
if (minusFlag == true)
{
*numberString = (char*)malloc(sizeof(char) * digits + 2);
(*numberString)[0] = '-';
(*numberString)[digits + 1] = '\0';
endPos = 1;
}
else
{
*numberString = (char*)malloc(sizeof(char) * digits + 1);
(*numberString)[digits] = '\0';
endPos = 0;
}
int readPos = strlen(*numberString) - 1;
dividedNumber = number;
while (readPos >= endPos)
{
(*numberString)[readPos] = (dividedNumber % 10) + '0';
dividedNumber /= 10;
readPos--;
}
}
int StringToInteger(const char* srcString)
{
int sum = 0;
bool minusFlag = false;
int endIdx = 0;
if (srcString[0] == '-')
{
minusFlag = true;
endIdx = 1;
}
int readPos = strlen(srcString) - 1;
int power = 0;
while (readPos >= endIdx)
{ // ascii 에서 int 값으로 변경하는건 문자열에서 읽어낸 값에서 '0' 을 빼는걸로 대체해도 무방하다.
sum += AsciiToInteger(srcString[readPos]) * pow(10, power);
power++;
readPos--;
}
if (minusFlag == true) sum *= -1;
return sum;
}
int AsciiToInteger(const char asciiChar)
{
int value = 0;
switch (asciiChar)
{
case 48:
value = 0;
break;
case 49:
value = 1;
break;
case 50:
value = 2;
break;
case 51:
value = 3;
break;
case 52:
value = 4;
break;
case 53:
value = 5;
break;
case 54:
value = 6;
break;
case 55:
value = 7;
break;
case 56:
value = 8;
break;
case 57:
value = 9;
break;
}
return value;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | unsigned int StringToUInt(string _str)
{
unsigned int sum = 0;
int endIdx = 0;
int readPos = _str.size() -1;
int power = 0;
while (readPos >= endIdx)
{
sum += (_str[readPos] - '0') * pow(10, power);
power++;
readPos--;
}
return sum;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | string UIntToString(unsigned int _value)
{
string uIntString;
int digits = 0;
int dividedNumber = _value;
while (dividedNumber > 0)
{
dividedNumber = dividedNumber / 10;
digits++;
} if (dividedNumber == 0) digits = 1;
int endPos = 0;
uIntString.resize(digits + 1);
uIntString[digits] = '\0';
int readPos = uIntString.size() -2 ;
dividedNumber = _value;
while (readPos >= endPos)
{
uIntString[readPos] = (dividedNumber % 10) + '0';
dividedNumber /= 10;
readPos--;
}
return uIntString;
}
|
댓글 없음:
댓글 쓰기