zoukankan      html  css  js  c++  java
  • 进制转换

    将M进制的数X转换为N进制的数输出。

    link:https://www.nowcoder.com/practice/ae4b3c4a968745618d65b866002bbd32?tpId=40&tqId=30990&tPage=2&rp=2&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking

    输入涉及大数运算,在知道进制转换规则的基础上,进行大数运算,

    #include <iostream>
    #include <string.h>
    #include <cstdio>
    #include <vector>
    using namespace std;
    const int maxn = 1010;
    struct bign
    {
    	int d[maxn], len;
    	bign() {
    		memset(d, 0, sizeof(d));
    		len = 0;
    	}
    };
    bign mutify(bign n, int x) {
    	bign c;
    	c.len = 0;
    	int carry = 0;
    	for (int i = 0; i < n.len; i++) {
    		int temp = n.d[i] * x + carry;
    		c.d[c.len++] = temp % 10;
    		carry = temp / 10;
    	}
    	while (carry != 0) {
    		c.d[c.len++] = carry % 10;
    		carry /= 10;
    	}
    	return c;
    }
    bign add(bign n1, bign n2) {
    	bign c;
    	c.len = 0;
    	int carry = 0;
    	for (int i = 0; i < n1.len || i < n2.len; i++) {
    		int temp = n1.d[i] + n2.d[i] + carry;
    		c.d[c.len++] = temp % 10;
    		carry = temp / 10;
    	}
    	if (carry != 0) {
    		c.d[c.len++] = carry;
    	}
    	return c;
    }
    bign m2ten(string x, int m) {//m进制变10进制
    	bign ans;
    	ans.len = 1;
    	bign product;
    	product.d[0] = 1;
    	product.len = 1;
    	for (int i = x.size()-1; i >=0 ; i--)
    	{
    		int temp;
    		if (x[i] >= '0' && x[i] <= '9') {
    			temp = x[i] - '0';
    		}
    		else if (x[i] >= 'A' && x[i] <= 'Z') {
    			temp = x[i] - 'A' + 10;
    		}
    		ans = add(ans, mutify(product, temp));
    		product = mutify(product, m);
    	}
    	return ans;
    }
    bign divide(bign num, int x, int& r) {
    	bign c;
    	c.len = num.len;
    	//从高位开始除
    	for (int i = num.len - 1; i >= 0; i--) {
    		r = num.d[i] + r * 10; //被除数的当前位
    		if (r < x) {//被除数当前位不够除
    			c.d[i] = 0;
    		}
    		else {
    			c.d[i] = r / x;
    			r = r % x;
    		}
    	}
    	while (c.len - 1 >= 1 && c.d[c.len - 1] == 0)
    		c.len--;
    	return c;
    }
    void show(bign num) {
    	for (int i = num.len - 1; i >= 0; i--)
    	{
    		if (num.d[i] > 9) {
    			printf("%c", (char)(num.d[i] - 10 + 'A'));
    		}
    		else {
    			printf("%d", num.d[i]);
    		}
    	}
    	cout << endl;
    }
    bign ten2n(bign num, int n) {//10进制变n进制
    	bign ans;
    	if (n == 10) {
    		return num;
    	}
    	else {
    		do
    		{
    			int r = 0;
    			num = divide(num, n, r);
    			ans.d[ans.len++] = r;
    		} while (!(num.d[0] == 0 && num.len == 1));
    	}
    	return ans;
    }
    int main()
    {
    	int m, n;
    	string x;
    	cin >> m >> n>>x;
    	bign t = m2ten(x, m);
    	bign res = ten2n(t, n);
    	show(res);
    }
    
    
  • 相关阅读:
    dev GridControl 代码自定义下拉框
    字符串utf-8相互转换
    .net 相关
    dev grid 样式
    winform 重置快捷写法
    winform 代码定义事件
    winform设置默认打印机
    可为空的对象必须具有一个值
    js获取当前日期之前或之后数据
    sql 快捷方法使用
  • 原文地址:https://www.cnblogs.com/custoyth/p/12726277.html
Copyright © 2011-2022 走看看