voidclear(int a[]){ for (int i = 0; i < LEN; ++i) a[i] = 0; }
voidread(int a[]){ staticchar s[LEN + 1]; scanf("%s", s); clear(a); int len = strlen(s); // 如上所述,反转 for (int i = 0; i < len; ++i) a[len - i - 1] = s[i] - '0'; // s[i] - '0' 就是 s[i] 所表示的数码 // 有些同学可能更习惯用 ord(s[i]) - ord('0') 的方式理解 }
voidprint(int a[]){ int i; for (i = LEN - 1; i >= 1; --i) if (a[i] != 0) break; for (; i >= 0; --i) putchar(a[i] + '0'); putchar('\n'); }
快速模幂的代码实现
原理课上学过,拆成2进制后复用自乘减少次数,优化复杂度到$Ologn$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
intquickPower(int a, int b)//是求a的b次方 { int ans = 1, base = a;//ans为答案,base为a^(2^n) while(b > 0)//b是一个变化的二进制数,如果还没有用完 { if(b & 1)//&是位运算,b&1表示b在二进制下最后一位是不是1,如果是: ans *= base;//把ans乘上对应的a^(2^n) base *= base;//base自乘,模乘这里要取模 b >>= 1;// 模乘这里要取模 //位运算,b右移一位,如101变成10(把最右边的1移掉了),10010变成1001。现在b在二进制下最后一位是刚刚的倒数第二位。结合上面b & 1食用更佳 } // 模乘这里要处理b为0情况 // ans%=p return ans; }