小记:这题让我知道了九余数定理。
九余数定理:一个数的每位数字之和等于这个数对9取余,如果等于0就是9
思路:利用九余数定理,求(n^n)%9值,一个一个n的乘即可,变乘边取模。这里只是针对n不大的情况。如果n太大,利用快速幂即可。
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
#define eps 10e-8
const int MAX_ = 10010;
int p[MAX_];
int m, n;
int main(){
while(scanf("%d",&n),n){
m = 1;
for(int i = 0; i < n; ++i){
m = (m*n)%9;
}
printf("%d\n",m?m:9);
}
return 0;
}
快速幂代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
#define eps 10e-8
const int MAX_ = 10010;
int p[MAX_];
int m, n;
int fastm(int a,int k,int mod){
int cnt=1, t = a;
while(k){
if(k&1)cnt = (cnt*((t)%mod))%mod;
t = ((t%mod)*(t%mod))%mod;
k >>= 1;
}
return cnt;
}
int main(){
while(scanf("%d",&n),n){
m = fastm(n,n,9);
printf("%d\n",m?m:9);
/*m = 1;
for(int i = 0; i < n; ++i){
m = (m*n)%9;
}
printf("%d\n",m?m:9);*/
}
return 0;
}