[C++] 模算术和长整型运算注意事项

2019-04-13 15:53发布

一·取模与模算术 我们知道,模算术有以下公式 (a+b)mod, n=((a, mod, n)+(b, mod, n))mod,n ab, mod, n=(a, mod, n)(b,mod,n)mod, n (a-b)mod, n=((a, mod, n)-(b, mod, n)+n)mod, n 1.我们发现,模算术公式中没有除法,事实上正是如此,因为取模本质上是取末尾数(低位),再进行运算。而除法是四则运算中唯一的运算顺序从高位到低位(厂字头竖式)的运算 2.我们发现,减法运算时,取模后被减数有可能小于减数导致结果变成负数,解决办法是在结果加上被模数再取一次模 3.负数取模合法,但是不可以模0 4.在C++中,取模符号%左右一般情况下左右必须是同一类型的数值,否则计算过程中会出错 5.取模对于一切实数数据类型都适用 6.运用模算术时,保险起见,每一步都取模(包括最后一步),经典例子是自定义函数内的运算及取模过程被判断语句跳过,数未参与计算,但是不能直接输出,必须取模 二·长整型运算 1.长整型范围:-2^63~2^63-1 2.长整型输入输出格式:Linux为 %lld ,Windows平台中有时为 %I64d,稳妥的方法是使用C++输入输出流cincout 3.长整型包括整形,但整形不包括长整型(合法:int a; long long b; b+=a; && printf("%lld",a);反之不合法) 三·综合 1.取模符号两边不可以一个int一个long long(该错误极难发现) 2.模运算的类型必须与总表达的值类型一致 例: int a,b,ans; long long m; ans=(a*b)%m; (错误)(1,2) int ans; long long a,b,m; ans=(a*b)%m; (错误)(2) int a,b; long long m,ans; ans=(a*b)%m; (错误)(1) int a,b,m,ans; ans=(a*b)%m; (错误,中间结果可能溢出)(1) 可见,有时模算术与不同类型混杂时极容易出错,最好类型统一为long long 模算术基础:传送门