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;
}

 

posted @ 2016-04-29 12:02  哲贤  阅读(294)  评论(0编辑  收藏  举报