【洛谷 P1143】进制转换 题解(数学+除基取余法)

进制转换

题目描述

请你编一程序实现两种不同进制之间的数据转换。

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制 n   ( 2 ≤ n ≤ 16 ) n\ (2\le n\le 16) n (2n16),第二行是一个 n n n 进制数,若 n > 10 n>10 n>10 则用大写字母 A ∼ F \verb!A!\sim \verb!F! AF 表示数码 10 ∼ 15 10\sim 15 1015,并且该 n n n 进制数对应的十进制的值不超过 1 0 9 10^9 109,第三行也是一个正整数,表示转换之后的数的进制 m   ( 2 ≤ m ≤ 16 ) m\ (2\le m\le 16) m (2m16)

输出格式

一个正整数,表示转换之后的 m m m 进制数。

样例 #1

样例输入 #1

16
FF
2

样例输出 #1

11111111

思路

输入一个整数,一个字符串,和另一个整数。第一个整数(n)代表源数的基数,字符串(src)代表源数(以字符串形式给出),第二个整数(m)代表目标基数。

然后,它从源数的最低有效位开始(即字符串的最右端),并逐个处理每一位。对于每一位,它首先检查这个字符是否大于’9’,也就是说,它是否是一个字母。如果是,那么它将该字符转换为对应的数字(A为10,B为11等等)。否则,它将该字符(一个数字字符)转换为对应的整数。然后,它将这个数乘以源基数的适当次方(对于最低有效位是0,次低有效位是1,依此类推),并将结果累加到一个总和中。这个总和(num1)最终将是源数转换为十进制的结果。

接下来,将这个十进制数转换为目标基数。通过不断地除以目标基数并取余数来做到这一点。每次取余数,它都会得到转换后的数的一位。如果这个余数大于9,那么它将这个余数转换为对应的字母;否则,它将这个余数转换为对应的数字字符。然后,它将这个字符添加到结果字符串的前面。这个过程一直持续到十进制数变为0。

最后,程序输出转换后的数(即目标基数的字符串表示)。这样就完成了从一个基数到另一个基数的转换。


AC代码

#include <cmath>
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;

int n, m;
long long num1;
string src, dst;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin >> n >> src >> m;

	auto it1 = src.rbegin();
	for (int i = 0; it1 != src.rend(); it1++, i++) {
		int j = 0;
		if (*it1 > '9') {
			j = *it1 + 10 - 'A';
		} else {
			j = *it1 - '0';
		}
		num1 += j * pow(n, i);
	}
	// cout << num1 << endl;

	dst = "";
	for (int i = num1; num1 > 0; num1 /= m) {
		int j = num1 % m;
		// cout << j << endl;
		if (j > 9) {
			dst = (char)(j - 10 + 'A') + dst;
		} else {
			dst = (char)(j + '0') + dst;
		}
	}
	cout << dst << endl;

	return 0;
}
  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
过河卒是一个典型的动态规划问题。首先,我们将整个棋盘看作一个二维数组,数组的每个元素表示到达该位置的路径数目。然后,我们根据题目给出的条件,逐步更新数组中的元素,直到计算出到达目标位置的路径数目。 具体的解题思路如下: 1. 首先,我们可以将马的位置设置为0,表示无经过该位置。 2. 然后,我们根据马的位置,更新数组中的元素。对于二维数组中的每个位置,我们根据左边和上边的位置来计算到达当前位置的路径数目。具体地,如果左边和上边的位置都可以经过,那么到达当前位置的路径数目就等于左边和上边位置的路径数目之和。如果左边或上边的位置无经过,那么到达当前位置的路径数目就等于左边或上边位置的路径数目。 3. 最后,我们输出目标位置的路径数目。 下面是洛谷p1002过河卒题解C++代码: ```cpp #include <bits/stdc++.h> using namespace std; int main() { long long a[21][21]; int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; // 初始化数组,马的位置设置为0 for(int i=0; i<=20; i++) { for(int k=0; k<=20; k++) { a[i][k] = 1; } } a[x2][y2] = 0; // 根据马的位置更新数组中的元素 if(x2 >= 2 && y2 >= 1) a[x2-2][y2-1] = 0; if(x2 >= 1 && y2 >= 2) a[x2-1][y2-2] = 0; if(x2 <= 18 && y2 >= 1) a[x2+2][y2-1] = 0; if(x2 <= 19 && y2 >= 2) a[x2+1][y2-2] = 0; if(x2 >= 2) a[x2-2][y2+1] = 0; if(x2 >= 1) a[x2-1][y2+2] = 0; if(y2 >= 1) a[x2+2][y2-1] = 0; if(y2 >= 2) a[x2+1][y2-2] = 0; // 动态规划计算路径数目 for(int i=1; i<=20; i++) { for(int k=1; k<=20; k++) { if(a[i][k] != 0) { a[i][k] = a[i-1][k] + a[i][k-1]; } } } // 输出目标位置的路径数目 cout << a[x1][y1] << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值