该程序除以一个数字并计算其商和余数。但我对模数运算得到了奇怪的结果。
#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。我认为在做标志时有处理标志的特殊规则的原因。
"然而,如果剩下的话,这仍然会留下一个模糊的标志 非零:剩余部分有两种可能的选择,一种是否定的 和另一个积极的,和两个可能的商选择 发生。通常,在数论中,正余数总是如此 选择,但编程语言选择取决于语言和 a和/或n的迹象。[6]标准Pascal和ALGOL 68给出了一个 正余数(或0)即使对于负除数,也有一些 编程语言,如C90,将其留给实现 当n或a中的任何一个为负数时。请参阅表格了解详情。模数 在大多数系统中,0未定义,但有些确实将其定义为。"
我想解决我的计划,但是,我不明白这意味着什么。
答案 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;
}