我编写了一个程序,以数字形式将数字(由程序员预定义)存储在数组中。
例如,如果我要在数组arrx [4]中存储一个数字1234,则其元素为:
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
我尝试使用以下代码来实现这一点:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int arrx[4]; // Stores the individual digits of number as array
int digx = 4; // Total number of digits in number
int i;
long int dupx = 1234; // Number which has to be stored in array
for(i = digx-1; i >= 0 ; i--)
{
arrx[digx-i-1] = int(dupx/pow(10,i));
dupx = dupx%(pow(10, i));
}
return 0;
}
但是,当我尝试编译以上代码时,收到以下错误消息:
错误:类型为'long int'和'double'的无效操作数为二进制'operator%'
我只能从上述错误中得出的唯一结论是问题在于模运算符。
因此,我心中有以下疑问
包含模运算符的代码到底是什么问题?
我该如何解决?
我正在使用Code :: Blocks版本17.12,并将GNU GCC作为编译器。
答案 0 :(得分:15)
您只能将%
与整数一起使用,pow
会产生浮点数。
您可以编写整数幂函数,或使用预定义的表,但颠倒构造顺序并从最右边的数字开始比较简单:
int main()
{
int arrx[4]; //stores the individual digits of number as array
int digx = 4; //total number of digits in number
long int dupx = 1234; //number which has to be stored in array
for(int i = 0; i < digx; i++)
{
arrx[digx-i-1] = dupx%10;
dupx = dupx/10;
}
return 0;
}
答案 1 :(得分:13)
std::pow
的各种形式都返回浮点类型,即使参数是整数类型也是如此。
由于%
需要整数参数,因此编译将失败。
使用(long)(pow(10,i))
是一种解决方法,当然要检查(long)
是否足够长。请注意,即使在IEEE754下,pow
也不要求返回可能的最佳浮点值,因此截断到long
有时可能是有害的。也许首选std::round
,然后再强制转换为long
。尽管当前的方式是考虑将pow
的任何实现都破坏为整数参数是有缺陷的实现。
在您的情况下,尽管我很想定义
constexpr/*use const on earlier standards*/ int powers[] = {1, 10, 100, 1000};
并适当索引。