怎样计算八进制的乘法

2024年8月9日 | 分类: 【编程】

【题目】

输入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;
}