Problem Address:http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1010
一道大数对一位数求余的题。
主要是找出规律。
m=1时,余数为0。
m=2时,个位数对2求余即为余数。
m=3时,所有位数和求3求余即为余数。
m=4时,前两位数对4求余即为余数。
m=5时,个位数对5求余即为余数。
m=6时,分别求出对2和对3的余数为r2、r3。
r2/r3 0 1 2
0 0 4 2
1 3 1 5
m=7时,看下面的规律
10 % 7 = 3, 10^2%7 = 2, 10^3%7 = 6, 10^4%7 = 4, 10^5%7 = 5, 10^6%7 = 1 ;
10^7%7 = 3, 10^8%7 = 2,........
所以只要从个位数开始,对应上面的数乘以该为的数,所有结果加起来再对7求余即为余数。
m=8时,前三位对8求余即为余数。
m=9时,所有位数的和相加,如果结果大于一位数则再把所有位数相加,如此重复,直到剩下一位数即为余数。
以下贴代码:
//前面是各个求余函数
#include <iostream>#include <cstring>using namespace std;int mod1(char n[105]){ return 0;}int mod2(char n[105]){ if (n[strlen(n)-1]%2==0) return 0; else return 1;}int mod3(char n[105]){ int i,len=strlen(n),sum; for (sum=0,i=0; i<len; i++) { sum += n[i]-'0'; } return sum%3;}int mod4(char n[105]){ int sum,len=strlen(n); if (len==1) { sum = n[0]-'0'; } else { sum = n[len-1]-'0' + 10*(n[len-2]-'0'); } return sum%4;}int mod5(char n[105]){ int len=strlen(n); return (n[len-1]-'0')%5;}int mod6(char n[105]){ int a=mod2(n),b=mod3(n); if (a==0) { if (b==0) return 0; else if (b==1) return 4; else return 2; } else { if (b==0) return 3; else if (b==1) return 1; else return 5; }}int mod7(char n[105]){ int i,j,len=strlen(n),sum=0; int a[6] = {1,3,2,6,4,5}; for (i=len-1,j=0; i>=0; i--,j++) { sum += a[j%6]*(n[i]-'0'); } return sum%7;}int mod8(char n[105]){ int sum,len=strlen(n); if (len==1) { sum = n[0]-'0'; } else if (len==2) { sum = n[len-1]-'0' + 10*(n[len-2]-'0'); } else { sum = n[len-1]-'0' + 10*(n[len-2]-'0') + 100*(n[len-3]-'0'); } return sum%8;}int mod9(char n[105]){ int i,len=strlen(n),sum,temp; for (sum=0,i=0; i<len; i++) { sum += n[i]-'0'; } while(sum>9) { temp = sum/10; sum = temp + sum-temp*10; } return sum; }int main(){ char n[105]; int m; while(scanf("%s %d", n, &m)!=EOF) { if (m==1) m = mod1(n); else if (m==2) m = mod2(n); else if (m==3) m = mod3(n); else if (m==4) m = mod4(n); else if (m==5) m = mod5(n); else if (m==6) m = mod6(n); else if (m==7) m = mod7(n); else if (m==8) m = mod8(n); else if (m==9) m = mod9(n); printf("%d/n", m); } return 0;}