题目描述
今天小明学会了进制转换,比如(10101)2 ,那么它的十进制表示的式子就是 :
1*2^4+0*2^3+1*2^2+0*2^1+1*2^0,
那么请你编程实现,将一个M进制的数N转换成十进制表示的式子。
注意:当系数为0时,该单项式要省略。
输入格式
两个数,M和N,中间用空格隔开。
输出格式
共一行,一个十进制表示的式子。
#include <iostream>
#include <queue>
using namespace std;
int main() {
int n; // 读一个整数
cin >> n;
int x, qaq = 0; // x记录输入数字的位数,qaq记录输入数字中非零数字的个数
char a; // 读取每个字符
queue<char> q, qq; // 两队列:q存储输入数字的每个位数,qq用于备份q的内容
cin >> a;
while (a != '0') //当读取到字符 '0' 时结束循环,输入串时末尾要添加0
{
q.push(a); //将字符添加到队列q中
qaq += (a - '0'); //非零字符的个数累加到变量qaq
cin >> a; // 读取下一个字符
}
// 输出队列q中存储的每个位数
cout << "输入数字的每个位数:" << endl;
while (!q.empty()) {
cout << q.front() << " "; // 输出队列q的首个字符
qq.push(q.front()); // 将队列q的首个字符添加到队列qq中
q.pop(); // 移除队列q的首个字符
}
cout << endl;
x = qq.size(); // 计算队列qq的大小,即输入数字的位数
cout << "输入数字的非零位数个数:" << qaq << endl;
cout << "输入数字的位数:" << x << endl;
cout << "转换为十进制表示的式子:" << endl;
while (!qq.empty()) {
x--;
if (qq.front() != '0') // 如果队列qq的首个字符不是 '0'
{
qaq--; // 非零字符的个数减一
cout << qq.front() << '*' << n << '^' << x; // 输出当前位数的字符和指数
if (x != 0 && qaq != 0)//若还有剩余的位数和非零字符
cout << '+';
}
qq.pop(); // 移除队列qq的首个字符
}
cout << endl;
return 0;
}
qaq += (a - '0');??非零字符的个数累加到变量qaq
&&? ?两个式子都为真时才算正确
思路:
1.首先读取一个整数n,表示进制M。
2.然后定义变量x和qaq,分别用于记录输入数字的位数和非零数字的个数。
3.使用队列q和qq来存储输入数字的每个位数,其中qq是q的备份。
4.通过循环读取字符a,当读取到字符'0'时结束循环。循环过程中,将字符a添加到队列q中,并累加非零字符的个数到变量qaq。
5.输出队列q中存储的每个位数,并将队列q的内容备份到队列qq中。
6.计算队列qq的大小,即输入数字的位数,并输出非零位数个数和位数信息。
7.输出转换为十进制表示的式子。遍历队列qq,每次取出首个字符。如果该字符不是'0',则输出当前位数的字符和指数,并根据是否还有剩余的位数和非零字符来决定是否输出加号。
核心代码:
cout << "转换为十进制表示的式子:" << endl;
while (!qq.empty()) {
x--;
if (qq.front() != '0') {
qaq--;
cout << qq.front() << '*' << n << '^' << x;
if (x != 0 && qaq != 0)
cout << '+';
}
qq.pop();
}
cout << endl;
这段代码实现了将输入数字转换为十进制表示的式子并输出。它通过遍历队列qq
,每次取出队列的首个字符进行处理。如果首个字符不是'0',则输出当前位数的字符和指数,并根据是否还有剩余的位数和非零字符来决定是否输出加号。