用户可以输入 0 或 1,将其附加到起始数字 0。
每次用户添加一个数字时,程序应该判断整数是否可以被 5 整除。
例子:
- 第一个数字是 0。
- 用户输入'1' - 完整的数字是'1' - 答案是否定的。
- 用户输入'0' - 完整的数字是'10' - 答案是否定的。
- 用户输入'1' - 完整的数字是'101' - 答案是肯定的。
我知道答案与最后一个余数和保留最后一个余数有关,但我找不到确切的计算或逻辑或数学来做到这一点。
在伪代码中:
remainder=0
while true {
remainder = remainder % 5
if remainder = 0
print "divisbile"
else
print "nondivisible"
remainder = (remainder<<1) + inputBit
}
解释:如果一个数能被 5 整除,则该数的倍数也能被 5 整除,因此该部分无意义。由于您的扩展可以建模为乘以 2 和加法,因此可以将其应用于您的问题。现在你要做的就是将余数相乘并添加输入并检查它是否可整除。
int old_x = 0,new_x;
while(1)
{
scanf("%d",new_x);
new_x= ((old_x<<1)|new_x);
old_x = new_x ;
new_x = new_x%5;
if(!new_x)
{
printf("divisible by 5)
old_x = 0;
}
else
printf("not divisible by 5)
}
诀窍是要知道一个数字是否可以被 5 整除,您只需要知道该数字的最后一位十进制数字。如果它以 5 或 0 结尾,那么它可以被 5 整除。如果它不以 5 或零结尾,它需要一个额外的数量,我称之为余数才能到达那里。现在鉴于您有余数,您可以对数字的最后一位进行逆向工程。然后将最后一位数字移动2 并添加用户键入的新数字 ( d )。根据d,您将获得该数字的新最后一位。有了它,您可以再次看到必须添加什么 newremainder 才能获得下一个 5 的倍数。
int newRemainder[2][5] = {{0,2,4,1,3},{4,1,3,0,2}};
int remainder = 0;
int d;
while(1){
scanf("%d", &d);
remainder = newRemainder[d][remainder];
if (remainder ==0) printf("multiple");
}