鱼C论坛

 找回密码
 立即注册
查看: 1093|回复: 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行,每行输出对应一个输入。为什么错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}

通过使用位运算来进行二进制转换,可以避免精度问题,从而得到正确的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

修正后的代码如下所示:
++#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[i] - '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[i]) << endl;    }    return 0;}
现在,您的代码应该能够正确将2进制数转换为3进制数了。如果还有问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 15:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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