【题目】
输入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; }