我必须创建一个程序,按照一定的顺序混乱数字,我知道我的代码可能不是最好的,但我有一个浮点异常,我不明白为什么,任何帮助将不胜感激
#define DIV 10
long long int inputNum();
int checkLength(long long int);
int even(int, long long int);
int odd(int, long long int);
long long int calcNewNum(int, long long int);
void print(long long int, long long int);
int main()
{
long long int input = 0;
int length = 0;
int check = 0;
int finalNum = 0;
input = inputNum();
length = checkLength(input);
check = odd(length, input);
finalNum = calcNewNum(length, input);
print(input, finalNum);
return(0);
}
long long int inputNum()
{
long long int input = 0;
do{
printf("Enter your non-negative integer: ");
scanf("%lld", &input);
if(input < 0)
{
printf("Error! Non-negative integers only!!\n");
}
}while(input < 0);
return(input);
}
int checkLength(long long int input)
{
int ct = 0;
do{
input /= DIV;
ct++;
}while(input != 0);
return(ct);
}
int even(int length, long long int input)
{
int digitOne = 0;
int digitTwo = 0;
int i;
int divideOne = 0;
int firstNum = 0;
int secondNum = 0;
int finalNum = 0;
digitOne = length / 2;
digitTwo = (length / 2) + 1;
divideOne = length - digitTwo;
for(i = 0; i < divideOne; i++)
{
input /= DIV;
}
secondNum = input % DIV;
input /= DIV;
firstNum = input % DIV;
if(firstNum < secondNum)
{
finalNum = firstNum;
}
else
{
finalNum = secondNum;
}
return(finalNum);
}
int odd(int length, long long int input)
{
int digit = 0;
int i;
int divide = 0;
int midNum = 0;
digit = length / 2;
divide = length - digit;
for(i = 0; i < digit; i++)
{
input /= DIV;
}
midNum = input % DIV;
return(midNum);
}
long long int calcNewNum(int length, long long int input)
{
int finalNum = 0;
long long int holder = 0;
int ct = 0;
int singleNum = 0;
long long int temp = 0;
holder = input;
ct = length;
if(input == 0)
{
finalNum = 0;
}
if(input / 10 == 0)
{
finalNum = input;
}
holder = input;
while(holder > 0)
{
if(holder % 2 == 0)
{
singleNum = even(length, holder);
length--;
}
if(holder % 2 == 1)
{
singleNum = odd(length, holder);
length--;
}
temp = holder % (long long int)pow(DIV,ct - 1);
holder /= pow(DIV, ct - 1);
holder *= pow(DIV, ct - 2);
holder += temp;
ct--;
finalNum += singleNum;
printf("%lld", holder);
if(holder != 0)
{
finalNum *= DIV;
}
}
return(finalNum);
}
void print(long long int input, long long int finalNum)
{
printf("Original Input: %lld", input);
printf("Altered Number: %lld", finalNum);
}
答案 0 :(得分:2)
上面评论中的Greg是对的 - 错误发生在第164行,当变量ct为0时,它除以零错误。在该行中,你将10除以幂ct -1那将是10 ^( - 1)。所以pow()返回.1并且因为你把它转换成long long int,小数被截断并且它试图除以0。
此错误似乎仅在输入数字的总和大于或等于10时才会发生。我没有通过整个程序来弄清楚为什么会这样。该计划的目标究竟是什么?
答案 1 :(得分:0)
好的,就像其他人提到的那样,对于一个数字总和大于或等于10的输入,在行
temp = holder % (long long int)pow(DIV,ct - 1);
模数的右边部分
(long long int)pow(DIV,ct - 1);
返回0.因此模运算溢出(除以0)。
顺便说一下,它返回0,因为你的代码以某种方式达到ct = 0,也就是说,你试图计算10 ^ { - 1};这对应于十进制数0.1,它在整数类型中舍入为0。
我不知道你的代码在做什么,但它有一个错误:D
答案 2 :(得分:0)
问题在这里
temp = holder % (long long int)pow(DIV,ct - 1);
它总是返回一些负值,因此temp将始终与您输入的数字相同。所以这个
holder /= pow(DIV, ct - 1);
总是将持有人设为0,而holder += temp;
将始终将持有人设为已输入的数字。
while(holder&gt; 0)将始终为true,并且无限运行。
检查 pow()。它的标志是双音(双x,双y),你正在使用DIV。这可能是个问题。