【问题标题】:Buggy transfer of single long long numbers to int array将单个 long long 数字转移到 int 数组的错误转移
【发布时间】:2021-02-10 07:48:01
【问题描述】:

我正在尝试获取一个 Long Long Int 并将每个位置编号拆分到数组中它自己的位置,当然,array[0] 是最大的数字。

例如,如果数字是 314,那么 array[0] = 3,array[1] =1,array[2] = 4。

这是一个微控制器计算器项目的一部分,我正在编写图形库(为了好玩)并使用数组来显示每一行。

问题是,它需要能够处理非常大的数字(9,999,999,999+),而且我正在处理大数据。如果 Long Long

例如,1,234,567,890 显示为 1,234,567,966。

这是我正在使用的代码的 sn-p:

long long int number = 1234567890;
int answerArray[10];
int numberLength = 10;

for(writeNumber = 0; writeNumber < numberLength; writeNumber++)
{
    answerArray[writeNumber] = ((int)(number / pow(10, (numberLength - 1 - writeNumber))) % 10;
}

我很确定这与“%”和多种数据类型有关,因为 Int 范围内的任何数字都可以完美运行。

你能看出我哪里出错了吗?有没有更好的方法来实现我的目标?大数有什么技巧吗?

【问题讨论】:

  • pow 用于浮点取幂; long long 参数会丢失精度,并且浮点不是您想在微控制器上使用的东西。通常你会重写它以连续除以 10 并取模。
  • @NateEldredge 太棒了,我不知道,所以你认为一次只做 10 个?
  • 是的,如果从右到左填充数组会更容易。

标签: arrays c modulo long-long


【解决方案1】:

pow的签名是

double pow(double x, double y);

当您调用函数时,计算将隐式使用浮点数。这就是为什么它不再像纯整数运算那样精确。

此外,你必须小心你如何投射到int

在你的问题中,你有

((int)(number / pow(10, (numberLength - 1 - writeNumber))) % 10;

括号不匹配,所以我假设您的意思是:

(int)(number / pow(10, (numberLength - 1 - writeNumber))) % 10;

但是,在应用模 10 运算之前,您在此处转换的数字可能超出 int 的范围。这可能导致整数溢出。代码和你写的一样:

((int)(number / pow(10, (numberLength - 1 - writeNumber)))) % 10;

为了避免溢出,最好先执行模运算。但是,此时您正在隐式处理 double (因为 pow),所以它也不理想。最好坚持使用纯整数运算来避免这些陷阱。

【讨论】:

    【解决方案2】:

    您的问题是您将可能非常大的数字转换为int。查看writeNumbernumberLength-1 时的迭代。在这种情况下,您将 long long 除以 1,然后将结果强制转换为 int。一旦number 大于 2^31-1,你就会遇到问题。

    您应该完全删除演员表以及对pow 的调用。相反,您应该通过修改 10 然后将number(或它的副本)除以 10 来迭代地获取下一个数字。

    例如,

    int index = sizeof(answerArray)/sizeof(answerArray[0]);
    for (long long x=number; x>0; x /= 10) {
        answerArray[--index] = x%10;
    }
    

    【讨论】:

    • sizeof(answerArray) 应该是元素的数量,sizeof answerArray / sizeof *answerArray
    • 谢谢!并且修改 long long int 仍然可以正常工作,因为它是一个整数?
    • 确实会的。
    • 只要是非负数。对于负数操作数,% 会产生负数结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多