说明:以下代码在vs2017编译执行通过
函数定义
#include<iostream>
#include<string>
#include<math.h>
#include <algorithm>
#include<iterator>
using namespace std;
int fun_ten_to_two(int num_ten)//十进制数转二进制数
{
string str;
while (num_ten)
{
if (num_ten % 2)
{
str.push_back('1');
}
else
{
str.push_back('0');
}
num_ten = num_ten / 2;
}
string::iterator pio_bin = str.begin();
string::iterator pio_end = str.end();
reverse(pio_bin, pio_end);
return stoi(str);
}
int fun_two_to_ten(int two_)//二进制数转十进制数
{
double temp = 0;
int ten_ = 0;
string str_ = to_string(two_);
reverse(str_.begin(), str_.end());
string::iterator iter = str_.begin();
for (int i = 0; iter < str_.end(); iter++)
{
temp = *iter - '0';
ten_ += temp * pow(2, i);
i++;
}
return ten_;
}
//任意2~36进制字符串转化为10进制
int Atoint(string s, int radix_of_s) //s是给定的radix进制字符串
{
int ans = 0;
for (int i = 0; i < s.size(); i++)
{
char t = s[i];
if (t >= '0'&&t <= '9') ans = ans * radix_of_s + t - '0';
else ans = ans * radix_of_s + t - 'a' + 10;
}
return ans;
}
//任意10进制数转化为2~32进制
string intToA(int n, int target_radix) //n是待转数字,radix是指定的进制
{
string ans = "";
do {
int t = n % target_radix;
if (t >= 0 && t <= 9) ans += t + '0';
else ans += t - 10 + 'a';
n /= target_radix;
} while (n != 0); //使用do{}while()以防止输入为0的情况
reverse(ans.begin(), ans.end());
return ans;
}
//十进制数转换为2~36进制的字符串利用_itoa_s(int , char* ,int,int );
string fun_of_ten_to_all(int& in_ten, int target_radix)
{
int count = 0;
string str_target;
char st[1000];
for (int i = 0; i < sizeof(st); i++)
{
st[i] = '+';
}
_itoa_s(in_ten, st, sizeof(st), target_radix);
for (int i = 0; i < sizeof(st) / sizeof(char); i++)
{
if (st[i] == 0)
break;
str_target.push_back(st[i]);
}
reverse(str_target.begin(), str_target.end());
return str_target;
}
//2到36进制转化为十进制(利用strol(const char* nptr,char** enptr,int base)函数)
long int fun_of_all_to_ten(string str, int radix_of_str)
{
char* cha = new char[str.size() + 1];
string::iterator iter = str.begin();
for (int i = 0; i < str.size(), iter < str.end(); i++)
{
cha[i] = *iter;
iter++;
}
cha[str.size()] = 0;
long int temp = strtol(cha, NULL, radix_of_str);
return temp;
}
/*
strtol()函数详解
iteye_15968 2011 - 08 - 07 15:52 : 00 53 收藏
strtol()函数的原型为:
long int strtol(const char *nptr, char **endptr, int base);
base是nptr的进制
函数的解释说明
这个函数会将参数nptr字符串根据参数base来转换成长整型数。参数base范围从2至36,或0。参数base代表采的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。当base值为0时则是采用10进制做转换,但遇到如’0x’前置字符则会使用16进制做转换、遇到’0’前置字符而不是’0x’的时候会使用8进制做转换。一开始strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。
strtol是atoi的增强版
主要体现在这几方面:
1、不仅可以识别十进制整数,还可以识别其它进制的整数,取决于base参数,比如strtol("0XDEADbeE~~", NULL, 16)返回0xdeadbee的值,strtol("0777~~", NULL, 8)返回0777的值。
2、endptr是一个传出参数,函数返回时指向后面未被识别的第一个字符。例如char *pos; strtol("123abc", &pos, 10); ,strtol返回123,pos指向字符串中的字母a。如果字符串开头没有可识别的整数,例如char *pos; strtol("ABCabc", &pos, 10); ,则strtol返回0,pos指向字符串开头,可以据此判断这种出错的情况,而这是atoi处理不了的。
3、如果字符串中的整数值超出long int的表示范围(上溢或下溢),则strtol返回它所能表示的最大(或最小)整数,并设置errno为ERANGE,例如strtol("0XDEADbeef~~", NULL, 16)返回0x7fffffff并设置errno为ERANGE
多数情况下,endptr设置为NULL, 即不返回非法字符串。*/
main()函数测试
#include<iostream>
#include<math.h>
#include<string>
#include<iterator>
#include<stdlib.h>
#include<iomanip>
using namespace std;
int fun_two_to_ten(int two_);
int fun_ten_to_two(int num_ten);
int Atoint(string s, int radix_of_s); //s是给定的radix进制字符串
string intToA(int n, int target_radix); //n是待转的十进制数字,radix是指定的进制
string fun_of_ten_to_all(int& in_ten, int target_radix);
long int fun_of_all_to_ten(string str, int radix_of_str);
int main()
{
int shi1 = 0;
cout << "测试fun_ten_to_two函数" << endl;
cout << "shi1=";
cin >> shi1;
int er1 = 0;
cout << "测试fun_two_to_ten函数" << endl;
cout << "er1=";
cin >> er1;
string str1;
int radix_of_str1 = 10;
cout << "测试Atoint函数" << endl;
cout << "str1=";
cin >> str1;
cout << "radix_of_str1=";
cin >> radix_of_str1;
int shi2 = 0;
int target_radix = 10;
cout << "测试intToA函数" << endl;
cout << "shi2=";
cin >> shi2;
cout << "target_radix=";
cin >> target_radix;
int shi3 = 0;
int target_radix_ = 10;
cout << "测试fun_of_ten_to_all函数" << endl;
cout << "shi3=";
cin >> shi3;
cout << "target_radix_=";
cin >> target_radix_;
string str2;
int radix_of_str2;
cout << "测试fun_of_all_to_ten函数" << endl;
cout << "str2=";
cin >> str2;
cout << "radix_of_str2=";
cin >> radix_of_str2;
cout << "fun_ten_to_two(shi1)=" <<fun_ten_to_two(shi1)<<endl;
cout << "\n";
cout << "fun_two_to_ten(er1)=" << fun_two_to_ten(er1) << endl;
cout << "\n";
cout << "Atoint(str1,radix_of_s)=" << Atoint(str1, radix_of_str1) << endl;
cout << "\n";
cout << "intToA(shi2,target_radix)=" << intToA(shi2, target_radix) << endl;
cout << "\n";
cout << "fun_of_ten_to_all(shi3,target_radix_)=" << fun_of_ten_to_all(shi3, target_radix_) << endl;
cout << "\n";
cout << "fun_of_all_to_ten(str2,radix_of_str2)=" << fun_of_all_to_ten(str2, radix_of_str2) << endl;
cout << "\n";
return 0;
}