为什么不对
#include <iostream>using namespace std;
#include <vector>
#include <string>
#include <cmath>
string to23(string x)
{
long long int ten = 0;
vector<int> nums;
int num;
for (int i = x.length()-1; i>=0; i--)
{
ten = ten + ((x)-'0') * pow(2, x.length()-i-1);
}
while (ten != 0)
{
num = ten % 3;
nums.push_back(num);
ten = ten / 3;
}
string res = "";
for (int i = nums.size() - 1; i >= 0; i--)
{
res = res + to_string(nums);
}
return res;
}
int main()
{
int n;
cin >> n;
vector<int> nums1;
cin.ignore();
int num1;
for (int i = 1; i <= n; i++)
{
cin >> num1;
nums1.push_back(num1);
}
for (int i = 0; i < nums1.size(); i++)
{
cout << to23(to_string(nums1)) << endl;
}
return 0;
}描述
输入一个2进制的数,要求输出该2进制数的3进制表示。
在3进制的表示中,只有0,1,2三种符号
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字
符串长度至少是1,至多是64
输出
n行,每行输出对应一个输入。为什么错了 这段代码的问题在于对于输入的二进制字符串进行转换时,使用了错误的计算方法。
具体来说,问题出在这一行代码:
ten = ten + ((x[ i])-'0') * pow(2, x.length()-i-1);
在这里,代码试图将二进制字符串转换为十进制数。但是,使用 pow 函数来计算乘方会导致精度问题,可能会产生舍入误差。由于二进制字符串的长度可能达到64位,这样的舍入误差可能会导致错误的结果。
为了解决这个问题,我们可以使用位运算来进行二进制转十进制的计算。具体来说,我们可以遍历二进制字符串的每一位,将每一位的值乘以相应的权重,并将结果累加起来。修改后的代码如下:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string to23(string x)
{
long long int ten = 0;
vector<int> nums;
int num;
for (int i = x.length() - 1; i >= 0; i--)
{
ten = (ten << 1) + (x[ i] - '0');
}
while (ten != 0)
{
num = ten % 3;
nums.push_back(num);
ten = ten / 3;
}
string res = "";
for (int i = nums.size() - 1; i >= 0; i--)
{
res = res + to_string(nums[ i]);
}
return res;
}
int main()
{
int n;
cin >> n;
vector<int> nums1;
cin.ignore();
int num1;
for (int i = 1; i <= n; i++)
{
cin >> num1;
nums1.push_back(num1);
}
for (int i = 0; i < nums1.size(); i++)
{
cout << to23(to_string(nums1[ i])) << endl;
}
return 0;
}
通过使用位运算来进行二进制转换,可以避免精度问题,从而得到正确的结果。 这段代码存在一些问题,需要进行修正:
1. 在计算2进制数转换成10进制数的过程中,ten应该使用long long int类型,否则可能出现整数溢出的问题。
2. 在将10进制数转换成3进制数的过程中,可以使用除3取余的方法,不必像现在一样先求出10进制数再转换成3进制数。
3. 在读入数据时,可以使用getline()函数来读入一个完整的字符串,不必使用cin和ignore()函数结合使用。
修正后的代码如下所示:
++
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string to23(string x)
{
long long int ten = 0;
for (int i = x.length()-1; i>=0; i--)
{
ten += (x - '0') * pow(2, x.length() - i - 1);
}
string res = "";
if (ten == 0) {
return "0";
}
while (ten)
{
res = to_string(ten % 3) + res;
ten /= 3;
}
return res;
}
int main()
{
int n;
cin >> n;
cin.ignore();
vector<string> nums1;
string num1;
for (int i = 1; i <= n; i++)
{
getline(cin, num1);
nums1.push_back(num1);
}
for (int i = 0; i < nums1.size(); i++)
{
cout << to23(nums1) << endl;
}
return 0;
}
现在,您的代码应该能够正确将2进制数转换为3进制数了。如果还有问题,请随时提问。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页:
[1]