同余运算在数论里面是很重要的一环,如果负整数取余弄不清楚机制,可能混在更复杂的数论题里面就导致迷惑,所以花点时间整理一下,还是很必要的。
非负整数的取余运算
如果 $a$ 和 $d$ 是两个非负整数,$d$ 非零,可以证明存在两个唯一的整数 $q$ 和 $r$,满足 $a = qd + r$ 且 $0 \le r < d$
。其中,$q$ 被称为商,$r$ 被称为余数。
有负数参与的取余运算
余数的符号和被除数相同,即被除数是负数时,无论除数是正还是负号,余数的符号都是负号。这样做也很好理解,你有什么数,当然就会余什么数。例题:
(-10) % 3 = -1;
10 % (-3) = 1;
(-10) % (-3) = -1;
如果我想让余数始终为正,商应该怎么求?
若被除数和除数都为正数时:根据表达式 $ a= qd + r$,商 $q = ( a - r ) / d$
若被除数为负数时,导致余数为负数,这时把余数变为正数: $ r = ( r % d + d ) % d$,商仍然是:$q = ( a - r ) / d$
,为什么?q作为b的一个倍数,当把 $r$ 由负变正,相当于把$ qb $ 变为 $(q-1)b$,且这时商变为:$q-$,根本不影响表达式。
举例:$ (-10 / 3 = -3 … -1) => (-10 = -3 \cdot 3 -1) => (-10 = -4 \cdot 3 +3 -1) => (-10 = -4 \cdot 3 + 2)$
这个有什么用?看到题
负二进制以 -2 作为基数,从最低位开始,每位的权重依次为 $1,-2,~4,-8,16,\dots1,−2, 4,−8,16,…$ 例如:
$(111) _{−2} = (−2)^2+(−2)^1+(−2)^0=3$
$(1011)_{-2}=(-2)^3+(-2)^1+(-2)^0=-9$
$(11010)_{-2}=(-2)^4+(-2)^3+(-2)^1=6$
给定一个以十进制表示的整数 n,请输出 n 的负二进制表示,头部不要出现多余的 0。
输入格式
单个整数:表示 n。
输出格式
单个字符串:表示 n 的负二进制表示。
样例数据
输入:
-13
输出:
110111
代码:
#include <cstdio>
using namespace std;
void d2(int a){
const int base=-2;
if(a==0) {
return;
}
int r=(a%base+2)%2;
d2((a-r)/base);
printf("%d",r);
}
int main(){
int n;
scanf("%d",&n);
if(n==0){
printf("0");//放入d2函数会导致非0数字多输出前导0
}
else{
d2(n);
}
return 0;
}