如何用C++ 自己写出STOI函数
时间: 2024-02-03 15:14:03 浏览: 113
STOI函数是一个将字符串转换为整数的C++标准库函数。以下是一个简单的C++函数,可以自己实现STOI功能:
```c++
#include <iostream>
#include <string>
int stoi(const std::string& str) {
int result = 0;
bool isNegative = false;
// 处理负数情况
if (str[0] == '-') {
isNegative = true;
}
// 遍历字符串,计算数字结果
for (int i = isNegative ? 1 : 0; i < str.length(); i++) {
result = result * 10 + (str[i] - '0');
}
// 处理负数
if (isNegative) {
result *= -1;
}
return result;
}
int main() {
std::string str = "-123";
int num = stoi(str);
std::cout << num << std::endl;
return 0;
}
```
这个函数接受一个字符串参数,然后遍历字符串解析出数字结果。如果字符串以负号开头,将结果变为负数。最后将结果返回。
相关问题
LeetCode二进制求和 用c++写出
LeetCode上关于二进制求和的问题通常涉及到将两个非负整数用二进制形式相加。在C++中,你可以通过模拟这个过程来解决这类问题。假设我们有两个整数a和b,可以按照从低位到高位的顺序逐位相加,并考虑进位。
下面是一个简单的C++函数示例:
```cpp
#include <bitset>
using namespace std;
class Solution {
public:
int addBinary(string a, string b) {
int len_a = a.size(), len_b = b.size();
if (len_a < len_b) {
swap(a, b);
swap(len_a, len_b);
}
vector<int> carry(len_a + 1, 0); // 初始化进位数组
for (int i = len_a - 1; i >= 0; --i) {
int sum = a[i] - '0' + b[i] - '0' + carry[i+1]; // 当前位相加并考虑进位
carry[i] = sum % 2; // 更新当前位的进位
a[i] = sum / 2 + '0'; // 如果有进位,更新原数
}
// 如果最后还有进位,需要处理
if (carry[0]) a = "1" + a;
return stoi(a); // 最终结果转换回十进制整数
}
};
```
在这个函数中,`addBinary`接受两个字符串类型的输入表示二进制数,然后逐位相加,同时跟踪进位。最后返回的是转换后的十进制整数。
用c++写出上述代码,代码越长越好,越基础越好。
当然,这是一个基础版本的C++代码实现,使用了while循环来逐个处理输入的字符串:
```cpp
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main() {
stack<int> scores; // 使用栈来模拟撤销操作
int current_score = 0; // 当前得分
string input;
while (cin >> input) { // 读取输入直到结束
if (isdigit(input[0])) { // 如果是整数
current_score = stoi(input); // 转换为整数并添加到得分
} else if (input == "+") { // 如果是+
if (!scores.empty()) { // 取出最近的得分
current_score += scores.top();
scores.pop(); // 移除最后一个元素
}
} else if (input == "D") { // 如果是D
if (!scores.empty()) { // 取出最近的得分
int prev_score = scores.top();
scores.pop();
current_score += prev_score * 2;
}
} else if (input == "C") { // 如果是C
while (!scores.empty()) { // 清空栈,直至找到有效得分
scores.pop();
}
}
scores.push(current_score); // 添加当前得分到栈,以备后续C操作
cout << "Round Score: " << current_score << endl;
}
int total_points = 0;
while (!scores.empty()) { // 计算所有有效得分的总和
total_points += scores.top();
scores.pop();
}
cout << "Total Points: " << total_points << endl;
return 0;
}
```
注意:这个代码没有使用类和模板,直接通过基本的数据结构(栈)来实现,每个操作都对应了一个单独的if-else分支,虽然简洁但也相对复杂,不太符合现代C++的风格。在实际项目中,可能会考虑封装成更优雅的函数或类来管理得分状态。
阅读全文