【洛谷 P2084】进制转换 题解(模拟+字符串)

进制转换

题目背景

题目描述

今天小明学会了进制转换,比如(10101)2 ,那么它的十进制表示的式子就是 :

1*24+0*23+1*22+0*21+1*2^0,

那么请你编程实现,将一个M进制的数N转换成十进制表示的式子。

注意:当系数为0时,该单项式要省略。

输入格式

两个数,M和N,中间用空格隔开。

输出格式

共一行,一个十进制表示的式子。

样例 #1

样例输入 #1

2 10101

样例输出 #1

1*2^4+1*2^2+1*2^0

提示

对于100%的数据,1<M<10,N的位数不超过1000。


思路

首先,从输入中读取一个整数m和一个字符串s。

代码中的变量i被初始化为字符串s的长度减1,这是因为在多项式中,最高位的指数是长度减1。接着,它设置一个标志变量flg,用于判断是否是第一个非零的字符,以决定是否需要输出一个加号。

然后,程序开始遍历字符串s中的每个字符。对于每个字符,如果它不是’0’,那么就输出这个字符和它的指数。这个指数是字符在字符串中的位置,从右到左,从0开始。如果这不是第一个非零的字符,那么在输出字符和它的指数之前,还会输出一个加号。

输出的格式是printf("%c*%d^%d", *it, m, i);,其中%c是字符,*是乘号,%d是整数,^是指数符号。在每次遍历后,i都会减1,因为我们是从字符串的末尾向前遍历。


AC代码

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

int main() {
	int m;
	string s;
	cin >> m >> s;
	int i = s.size() - 1;
	bool flg = 0;
	for (auto it = s.begin(); it != s.end(); it++) {
		if (*it != '0') {
			if (!flg) {
				flg = 1;
			} else {
				putchar('+');
			}
			printf("%c*%d^%d", *it, m, i);
		}
		i--;
	}
	return 0;
}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值