【题目】
输入2个十六进制数,进行相乘,输出乘积,以十六进制数表示。
【样例】
输入:
350A
12
输出:
3BAB4
【思路】
十进制中转法:
1. 先将十六进制数转换为十进制数
2. 十进制数进行相乘
3. 将乘积转换为十六进制数
350A = 13578(Dec)
12 = 18(Dec)
13578 × 18 = 244404(Dec) = 3BAB4(Hex)
十六进制直接法:
十六进制的乘除法运算的规则是:逢16进1。
先用2*350A
2*A=20 进一位,余20-16=4
2*0=0 进零位,余0,加上面的进位等于1
2*5=10 进零位,余A
2*3=6 进零位,余6
所以2*350A=6A14
同理1*350A=350A
最后350A*12=6A14+350A0=3BAB4
350A 12 * ------- 6A14 350A ------ 3BAB4
中转法代码:
string Hex1, Hex2, strans;
int DecArr[MAX] = { 0 };
void Reverse(char* s ) {//新轮子,翻转字符串
int n=numberaio(s);
for (int i = 0, j = n - 1; i < j; i++, j--) {
char c = s[i];
s[i] = s[j];
s[j] = c;
}
}
long long HexToDec(string aHex)//转化十六进制
{
long Dec = 0;
int temp = 0;
int count = 0;
int DecCount = 0;
int strlen= aHex.length();
int StrLen = strlen;
while (strlen--)
{
if (aHex[count] < '0' || (aHex[count]>'9' && aHex[count]<'A') || (aHex[count]>'F'&&aHex[count]<'a') || aHex[count]>'f')
{
cout << "输入的不是十六进制格式" << endl;
return 0;
}
count++;
}
count = StrLen-1;
while (StrLen--)
{
if (aHex[count] >= '0' && aHex[count] <= '9')
{
DecArr[DecCount++] = aHex[count] - '0';
}
else if (aHex[count] >= 'A' && aHex[count] <= 'F')
{
DecArr[DecCount++] = aHex[count] - 'A' + 10;
}
else
{
DecArr[DecCount++] = aHex[count] - 'a' + 10;
}
count--;
}
int j = 0;
for (int i = 0; i < DecCount; i++)
{
if (i < 1)
{
Dec = Dec + DecArr[i];
}
else
{
Dec = (Dec + (DecArr[i] * (16 << j)));
j += 4;
}
}
return Dec;
}
void decToHex(long long n)
{
char hexNum[MAX]="",strtemp[MAX]="";
int i = 0;
while (n != 0)
{
int temp = 0;
temp = n % 16;
if (temp < 10)
{
hexNum[i] = temp + 48;
i++;
}
else
{
hexNum[i] = temp + 87;
i++;
}
n /= 16;
}
Reverse(hexNum);
strans.assign(hexNum);
}
int main()
{
long long Dec1, Dec2, ans;
cin >> Hex1 >> Hex2;
Dec1 = HexToDec(Hex1);//16进制转10进制 Conversion:改变
Dec2 = HexToDec(Hex2);
ans = Dec1 * Dec2;
decToHex(ans);
cout << strans << endl;
return 0;
}
直接法代码(有bug):
void Reverse(char* s ) {//新轮子,翻转字符串
int n=numberaio(s);
for (int i = 0, j = n - 1; i < j; i++, j--) {
char c = s[i];
s[i] = s[j];
s[j] = c;
}
}
long long HexToDec(string aHex)//转化十六进制
{
long Dec = 0;
int temp = 0;
int count = 0;
int DecCount = 0;
int strlen= aHex.length();
int StrLen = strlen;
while (strlen--)
{
if (aHex[count] < '0' || (aHex[count]>'9' && aHex[count]<'A') || (aHex[count]>'F'&&aHex[count]<'a') || aHex[count]>'f')
{
cout << "输入的不是十六进制格式" << endl;
return 0;
}
count++;
}
count = StrLen-1;
while (StrLen--)
{
if (aHex[count] >= '0' && aHex[count] <= '9')
{
DecArr[DecCount++] = aHex[count] - '0';
}
else if (aHex[count] >= 'A' && aHex[count] <= 'F')
{
DecArr[DecCount++] = aHex[count] - 'A' + 10;
}
else
{
DecArr[DecCount++] = aHex[count] - 'a' + 10;
}
count--;
}
int j = 0;
for (int i = 0; i < DecCount; i++)
{
if (i < 1)
{
Dec = Dec + DecArr[i];
}
else
{
Dec = (Dec + (DecArr[i] * (16 << j)));
j += 4;
}
}
return Dec;
}
void decToHex(long long n)
{
char hexNum[MAX]="",strtemp[MAX]="";
int i = 0;
while (n != 0)
{
int temp = 0;
temp = n % 16;
if (temp < 10)
{
hexNum[i] = temp + 48;
i++;
}
else
{
hexNum[i] = temp + 87;
i++;
}
n /= 16;
}
Reverse(hexNum);
strans.assign(hexNum);
}
int main()
{
int jz = 16;
string s1, s2;
int res[MAX];
cin >> s1 >> s2;
int i, j, len1, len2;
len1 = s1.size();
len2 = s2.size();
//初始化res为0
memset(res, 0, sizeof(res));
//两数相乘的结果放在res中
for (i = 0; i < len1; i++) {
for (j = 0; j < len2; j++) {
if (s1[i] >= 97) {
res[i + j + 1] += (s1[i] - 87) * (s2[j] - 87);
}
else {
res[i + j + 1] += (s1[i] - 30) * (s2[j] - 30);
}
}
}
//处理进位,从数字低位开始
for (i = len1 + len2 - 1; i > 0; i--) {
if (res[i] >= jz) {
res[i - 1] += res[i] / jz;
res[i] = res[i] % jz;
}
}
i = 0;
while (res[i] == 0) {
i++;
}
for (; i < len1 + len2; i++) {
cout << res[i];
}
system("pause");
bukaqingping();
return 0;
}