黎子卿 发表于 2023-10-31 19:55:01

为什么不对

#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行,每行输出对应一个输入。为什么错了

isdkz 发表于 2023-10-31 19:55:47

这段代码的问题在于对于输入的二进制字符串进行转换时,使用了错误的计算方法。

具体来说,问题出在这一行代码:
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;
}


通过使用位运算来进行二进制转换,可以避免精度问题,从而得到正确的结果。

Mike_python小 发表于 2023-10-31 19:56:36

这段代码存在一些问题,需要进行修正:

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]
查看完整版本: 为什么不对