进制转换与高精度计算

155 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

C语言笔记之二进制: blog.csdn.net/weixin_4471…

十进制转其它进制

#include <iostream>		//十进制与其它进制转换
#include <algorithm>
#include <string>
using namespace std;

string HEX = "0123456789abcdef";	//16进制字符
string DEC_k(long long DEC, int k)	//10进制转变为K进制 (2<= k <=16)
{
	string knum;
	while (DEC)
	{
		knum += HEX[DEC % k];
		DEC /= k;
	}
	reverse(knum.begin(), knum.end());
	return knum;
}

其它进制转十进制

int to_int(char ch)
{
	if(ch >= '0' && ch <= '9')
		return ch - 48;
	else
		return ch - 87;	//a的ASCII码为97
}
long long k_DEC(string knum, int k)	//将k进制转为10进制 (2<= k <=16)
{
	long long DEC = 0;
	int len = knum.length();
	for (int i = 0; i < len; i++)
		DEC += to_int(knum[i]) * pow(k, len - i - 1);
	return DEC;
}
int main()
{
	long long num;
	string knum;
	int k;
	cin >> num >> k;	//输入10进制数与要转换的进制k
	knum = DEC_k(num, k);
	cout << k << "进制数为:" << endl;
	cout << knum << endl;

	cout << "从新转换为10进制数:" << endl;
	cout << k_DEC(knum, k) << endl;

	system("pause");
	return 0;
}

运行结果

二进制

input:
1235 2
output:
2进制数为:
10011010011
从新转换为10进制数:
1235
请按任意键继续. . .

八进制

input:
231654 8
output:
8进制数为:
704346
从新转换为10进制数:
231654
请按任意键继续. . .

十六进制

input:
312624654 16
output:
16进制数为:
12a2460e
从新转换为10进制数:
312624654
请按任意键继续. . .

其它进制

十三进制

input:
13215231 13
output:
13进制数为:
2979183
从新转换为10进制数:
13215231
请按任意键继续. . .

七进制

input:
13215612 7
output:
7进制数为:
220221324
从新转换为10进制数:
13215612
请按任意键继续. . .

高精度加法

int A[100], B[100], C[102];		//C = A + B
string add(string a, string b)
{
	string ans;
	int len1 = a.length(), len2 = b.length();
	int len = max(len1, len2), t = 0; //t表示进位
	for (int i = 0; i < len1; i++)
		A[i] = a[len1 - i - 1] - '0';
	for (int i = 0; i < len2; i++)
		B[i] = b[len2 - i - 1] - '0';
	for (int i = 0; i < len; i++)
	{
		int k = A[i] + B[i] + t;
		C[i] = k % 10;
		t = k / 10;
	}
	for (int i = 0; i < len; i++)
	{
		char ch = C[i] + '0';
		ans = ch + ans;
	}
	if(t > 0)
		ans = '1' + ans;

	return ans;
}

n进制加法

int H(char ch)
{
	if (ch >= '0' && ch <= '9')
		return ch - '0';
	else if (ch >= 'a' && ch <= 'z')
		return ch - 87;
}

string HEX = "0123456789abcdef";
int A[100], B[100], C[100];
string add(string a, string b, int n)
{
	string ans;
	int len1 = a.length(), len2 = b.length();
	int len = max(len1, len2), t = 0;
	for (int i = 0; i < len1; i++)
		A[i] = H(a[len1 - 1 - i]);
	for (int i = 0; i < len2; i++)
		B[i] = H(b[len2 - 1 - i]);

	for (int i = 0; i < len; i++)
	{
		int k = A[i] + B[i] + t;
		C[i] = k % n;
		t = k / n;
	}
	for (int i = 0; i < len; i++)
		ans = HEX[C[i]] + ans;
	if(t > 0)
		ans = '1' + ans;
	return ans;
}

高精度减法