有时比赛提供的编译环境不支持c++中的stoi函数和to_string函数,前者是将 字符串转为数字,后者将数字转为字符串.
2者互转的媒介可利用ascii码,数字与字符±‘0’互转.
stoi中利用了pow函数.
to_number中利用了栈的逆序特点.
自己实现了一下,不过可能数的大小(长度)会收long long 限制.
自我安慰一下,暂且就自封造个小*吧2333.
stoi:字符串转数字
ll stoi(string s){
ll res=0;
int k=0;
for(int i=s.size()-1;i!=-1;i--) //终止条件 也可写做 ~i
res+=(s[i]-'0')*pow(10,k++); //亲测,此处k++和++k最后k结果一样,都是s的size
return res;
}
to_number:数字转字符串
string to_string(ll x){
stack<char> stk;
string s;
char tmp;
ll a; //每次的个位
while(x){
a=x%10;
x/=10;
tmp=a+'0';
stk.push(tmp);
}
while(stk.size()){ //利用栈逆序
s+=stk.top();
stk.pop();
}
return s;
}
测试代码
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<math.h>
#include<stack>
using namespace std;
typedef long long ll;
ll stoi(string s){
ll res=0;
int k=0;
for(int i=s.size()-1;i!=-1;i--) //终止条件 也可写做 ~i
res+=(s[i]-'0')*pow(10,k++); //亲测,此处k++和++k最后k结果一样,都是s的size
return res;
}
string to_string(ll x){
stack<char> stk;
string s;
char tmp;
ll a; //每次的个位
while(x){
a=x%10;
x/=10;
tmp=a+'0';
stk.push(tmp);
}
while(stk.size()){ //利用栈逆序
s+=stk.top();
stk.pop();
}
return s;
}
int main()
{
string s="1236611515516993"; // stoi函数
cout<<stoi(s)<<endl;
ll a=123494751;
string ss=to_string(a); // to_string函数
cout<<ss+"hahai"+'&'<<endl;
return 0;
}
/*
string to_string(ll x){ //这样也可 [c++中字符串可与单个字符直接拼接(+连接)]
stack<string> stk;
ll k=0; // k统计传进来的数字x的位数
string s,tmp;
ll a; //每次的个位
while(x){
a=x%10;
x/=10;
tmp=a+'0';
// cout<<tmp<<endl;
stk.push(tmp);
}
while(stk.size()){
s+=stk.top();
stk.pop();
}
return s;
}
*/
运行结果