模数运算返回奇怪的结果

时间:2016-09-10 01:47:19

标签: java

该程序除以一个数字并计算其商和余数。但我对模数运算得到了奇怪的结果。

#include "stdio.h"
#include "string.h"
#include "stdlib.h"


typedef struct A_NewNumber{
    struct A_NewNumber *next;
    double newNum;
} NewNumber;


NewNumber *AddNumber(NewNumber *previous, char *input){
    //char input[16];
    //double numEntered = 0;

    NewNumber *newNum = malloc(sizeof(NewNumber));
    sscanf(input, "%lf", &newNum->newNum);


    //sscanf(input, "%s", newNum->enterNumber);
    //numEntered = atof(input);

    /*if (previous != NULL){
        previous->newNum;
    }*/
    newNum->next = NULL;
    newNum->newNum = 0;
    return newNum;

}

void PrintList(NewNumber *start){
    NewNumber *currentNumber = start;
    int count = 0;

    while(currentNumber != NULL){
        count++;
        printf("Numbers:%lf\n", 
            currentNumber->newNum); 
        currentNumber = currentNumber->next;
    }
    printf("Total Numbers Entered%d\n", count);
}

void CleanUp(NewNumber *start){
    NewNumber *freeMe = start;
    NewNumber *holdMe = NULL;

    while(freeMe != NULL){
        holdMe = freeMe->next;
        free(freeMe);
        freeMe = holdMe;
    }
}

int main(){
    //indexNum = 0;
    char command[16];
    char input[16];
    //float userInput;
    NewNumber *userEnter = NULL;
    NewNumber *start = NULL;
    NewNumber *newest = NULL;

    while(fgets(input, sizeof input, stdin)){
        printf("Please enter a number->");
        printf("Enter 'quit' to stop or 'print' to print/calculate");
        sscanf(input, "%s", command);
        if(newest == NULL){
            start = AddNumber(NULL, input);
            newest = start;
        }else{
            newest = AddNumber(newest, input);
        }if(strncmp(command, "print", 5) == 0){
            PrintList(start);
        }else if(strncmp(command, "quit", 4)== 0){
            printf("\n\nQuitting....\n");
            break;
           //userInput = enterNumber;
        }
    }
    CleanUp(start);
    return 0;
}

58585 / -45给出商为-1301,余数为40.但谷歌表示58585%-45 = -5。我认为在做标志时有处理标志的特殊规则的原因。

来自Modulo Operations

  

"然而,如果剩下的话,这仍然会留下一个模糊的标志   非零:剩余部分有两种可能的选择,一种是否定的   和另一个积极的,和两个可能的商选择   发生。通常,在数论中,正余数总是如此   选择,但编程语言选择取决于语言和   a和/或n的迹象。[6]标准Pascal和ALGOL 68给出了一个   正余数(或0)即使对于负除数,也有一些   编程语言,如C90,将其留给实现   当n或a中的任何一个为负数时。请参阅表格了解详情。模数   在大多数系统中,0未定义,但有些确实将其定义为。"

我想解决我的计划,但是,我不明白这意味着什么。

1 个答案:

答案 0 :(得分:1)

取决于你想要什么。在数学和一些编程语言中,如果模数不为零,那么它与除数具有相同的符号,将整数除法视为截断为负无穷大。在其他编程语言中,如果模数不为零,则它与被除数具有相同的符号,将整数除法视为截断为零。一些编程语言包括模运算符(与除数相同的符号)和余数运算符(与被除数相同的符号)。

对于模数的数学类型,则r =(a + k * b)%b为r返回相同的值,无论k是负,零还是正。这也意味着任何红利模b都只有b个可能的值,而另一个情况是红色模b的2 * b - 1个可能的值,取决于红利的符号。

C模块以模数的方式工作的例子:

int modulo(int n, int p)
{
int r = n%p;
    if(((p > 0) && (r < 0)) || ((p < 0) && (r > 0)))
        r += p;
    return r;
}