uva10515powers et al指数找规律
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85482#problem/O
题意:输入底数和指数,输出所得数的最后一位。其中指数和底数的范围达到10^100。
思路:在接收底数后只取最后一位即可,将1至9每个能得出的最后一位列出,列如2,指数每差4循环一次,所以将指数取最后2位(根据同余原理,100和100的倍数都可将4整除,所以可以只看最后2位,看余多少,整个指数就余多少),将底数的最后一位和指数的最后2位列表,选出所得数的最后一位输出。
一个数组输入字符串,系统在结尾自动赋\0,计算字符长度时不计\0;若输入的是一个一个的字符,则不赋0,不能计算长度。
#include<iostream> #include<cstring> #include<cstdio> using namespace std; void f(int m,int n,int n1) { switch(m) { case 0:case 1:case 5:case 6:cout<<m;break; case 2:switch(n%4){case 1:cout<<2;break;case 2:cout<<4;break;case 3:cout<<8;break;case 0:cout<<6;}break; case 3:switch(n%4){case 1:cout<<3;break;case 2:cout<<9;break;case 3:cout<<7;break;case 0:cout<<1;}break; case 4:switch(n1%2){case 1:cout<<4;break;case 0:cout<<6;}break; case 7:switch(n%4){case 1:cout<<7;break;case 2:cout<<9;break;case 3:cout<<3;break;case 0:cout<<1;}break; case 8:switch(n%4){case 1:cout<<8;break;case 2:cout<<4;break;case 3:cout<<2;break;case 0:cout<<6;}break; case 9:switch(n1%2){case 1:cout<<9;break;case 0:cout<<1;}break; } } int main() { char a[150],b[150]; while(scanf("%s%s",a,b)) { if(!(strcmp(a,"0")||strcmp(b,"0")))break; if(!strcmp(a,"0")){cout<<0<<endl;continue;} if(!strcmp(b,"0")){cout<<1<<endl;continue;} int s=strlen(a); int m=a[s-1]-'0'; int t=strlen(b); int n1=b[t-1]-'0'; int n11; if(t==1)n11=0; else n11=b[t-2]-'0'; int n2=n11*10; int n=n1%4+n2%4; f(m,n,n1); cout<<endl; } return 0; }