【题目】
输入2个八进制数,进行相乘,输出乘积,以八进制数表示。
【样例】
输入:
276
54
输出:
20250
【思路】
十进制中转法:
1. 先将八进制数转换为十进制数
2. 十进制数进行相乘
3. 将乘积转换为八进制数
276 = 190(Dec)
54 = 44(Dec)
190 × 44 = 8360(Dec) = 20250(Oct)
八进制直接法:
4*6=24
24/8=3余0(结果为30,不足位数补0)
因此这里得到从右到左第一位为【0】并进3
4*7=28;28/8=3余4(结果为34,34+3=37)
因此这里得到从右到左第二位为【7】并进3
4*2=8;8/8=1余0(结果为10,10+3=13)
因此这里得到从右到左第三位为【3】并进1
获取进位数1,并不大于8,因此结果为【1】
最终得到的结果就为1370
同理得到276*5结果等于1666
在将两个数字相加进行逢8进1(取余当值)计算得到结果为20250
276 54 * ------- 1370 1666 ------ 20250
八进制的间转法:
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <algorithm>
#include <cmath>
#include <vector>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iomanip>
#define MAX 10000//最大
//#define jz 8
using namespace std;
int everyToDec(int n,int jz)//8转10
{
int num = n;
int dec = 0;
int base = 1;
int temp = num;
while (temp)
{
int last = temp % 10;
temp /= 10;
dec += last * base;
base *= jz;
}
return dec;
}
char bits[]={"0123456789ABCDEF"};
void DecToEveryone(char *s,int n,int b)//十转多
{
//边界判断
if(n==0)
return;
//开始递归
DecToEveryone(s,n/b,b);
int len=strlen(s);
s[len]=bits[n%b];
s[len+1]='\0';
}
int main()
{
int n, m, ans, b;
char s[MAX]="";
cin >> n >> m;
cin >> b;
n = everyToDec(n,b);
m = everyToDec(m,b);
ans = n * m;
//ans十进制数,b要转换的进制
DecToEveryone(s, ans, b);
cout << s << endl;
return 0;
}
直接法:
int main()
{
srand((unsigned)time(NULL));
system("title 高精多乘");
int jz;//进制
string s1, s2;
int res[130];
cin >> jz;
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++) {
res[i + j + 1] += (s1[i] - '0') * (s2[j] - '0');
}
}
//处理进位,从数字低位开始
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++) {
printf("%d", res[i]);
}
system("pause");
bukaqingping();
int temp = NULL;
int temp1, temp2, temp3;
for (size_t i = 0; i < str1.size(); i++)
{
temp1 = str1[i] - 30;
for (size_t j = 0; j < str2.size(); j++)
{
//30是0的ASCII码,在这里进行转化
temp2 = str2[j] - 30;
temp3 = temp1 * temp2;
if (temp3 >= jz) {//当进位时,要预留temp
temp = temp3/jz;
temp3 %= jz;
}
str3.assign(str3+(char)(temp3 + 30));
if (temp != NULL) {//后面加temp
str3[i] += temp;
if ((temp + temp3) >= jz) {
temp = NULL;
temp++;
}
else {
temp = NULL;
}
}
}
}
cout << str3[0] << endl;
return 0;
}