鱼C论坛

 找回密码
 立即注册
查看: 1563|回复: 2

为什么不对

[复制链接]
发表于 2023-10-31 19:55:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[i])-'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[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;
}描述
输入一个2进制的数,要求输出该2进制数的3进制表示。
在3进制的表示中,只有0,1,2三种符号
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字
符串长度至少是1,至多是64
输出
n行,每行输出对应一个输入。为什么错了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-31 19:55:47 | 显示全部楼层
这段代码的问题在于对于输入的二进制字符串进行转换时,使用了错误的计算方法。

具体来说,问题出在这一行代码:
  1. ten = ten + ((x[ i])-'0') * pow(2, x.length()-i-1);
复制代码

在这里,代码试图将二进制字符串转换为十进制数。但是,使用 pow 函数来计算乘方会导致精度问题,可能会产生舍入误差。由于二进制字符串的长度可能达到64位,这样的舍入误差可能会导致错误的结果。

为了解决这个问题,我们可以使用位运算来进行二进制转十进制的计算。具体来说,我们可以遍历二进制字符串的每一位,将每一位的值乘以相应的权重,并将结果累加起来。修改后的代码如下:

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. using namespace std;

  5. string to23(string x)
  6. {
  7.     long long int ten = 0;
  8.     vector<int> nums;
  9.     int num;
  10.     for (int i = x.length() - 1; i >= 0; i--)
  11.     {
  12.         ten = (ten << 1) + (x[ i] - '0');
  13.     }
  14.     while (ten != 0)
  15.     {
  16.         num = ten % 3;
  17.         nums.push_back(num);
  18.         ten = ten / 3;
  19.     }
  20.     string res = "";
  21.     for (int i = nums.size() - 1; i >= 0; i--)
  22.     {
  23.         res = res + to_string(nums[ i]);
  24.     }
  25.     return res;
  26. }

  27. int main()
  28. {
  29.     int n;
  30.     cin >> n;
  31.     vector<int> nums1;
  32.     cin.ignore();
  33.     int num1;
  34.     for (int i = 1; i <= n; i++)
  35.     {
  36.         cin >> num1;
  37.         nums1.push_back(num1);
  38.     }
  39.     for (int i = 0; i < nums1.size(); i++)
  40.     {
  41.         cout << to23(to_string(nums1[ i])) << endl;
  42.     }
  43.     return 0;
  44. }
复制代码


通过使用位运算来进行二进制转换,可以避免精度问题,从而得到正确的结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-31 19:56:36 | 显示全部楼层
这段代码存在一些问题,需要进行修正:

1. 在计算2进制数转换成10进制数的过程中,ten应该使用long long int类型,否则可能出现整数溢出的问题。

2. 在将10进制数转换成3进制数的过程中,可以使用除3取余的方法,不必像现在一样先求出10进制数再转换成3进制数。

3. 在读入数据时,可以使用getline()函数来读入一个完整的字符串,不必使用cinignore()函数结合使用。

修正后的代码如下所示:

  1. ++
  2. #include <iostream>
  3. #include <vector>
  4. #include <string>
  5. using namespace std;
  6. string to23(string x)
  7. {
  8.     long long int ten = 0;
  9.     for (int i = x.length()-1; i>=0; i--)
  10.     {
  11.         ten += (x[i] - '0') * pow(2, x.length() - i - 1);
  12.     }
  13.     string res = "";
  14.     if (ten == 0) {
  15.         return "0";
  16.     }
  17.     while (ten)
  18.     {
  19.         res = to_string(ten % 3) + res;
  20.         ten /= 3;
  21.     }
  22.     return res;
  23. }
  24. int main()
  25. {
  26.     int n;
  27.     cin >> n;
  28.     cin.ignore();
  29.     vector<string> nums1;
  30.     string num1;
  31.     for (int i = 1; i <= n; i++)
  32.     {
  33.         getline(cin, num1);
  34.         nums1.push_back(num1);
  35.     }
  36.     for (int i = 0; i < nums1.size(); i++)
  37.     {
  38.         cout << to23(nums1[i]) << endl;
  39.     }
  40.     return 0;
  41. }
复制代码

现在,您的代码应该能够正确将2进制数转换为3进制数了。如果还有问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 03:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表