1604 人见人爱A^B

首先让我感慨一下,这道题做的太爽了!并不是它用到了什么高级的知识点,而是因为脑洞大开啊!

我把我解决这道题的全部过程写下来。

这道题的重点解决就是第三个示例输入:6789 10000;

一:为了避免溢出我使用了long long,代码如下:

#include<stdio.h>
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        long long s = 1;
        int c;
        for(int i=1;i<=b;i++)
            s = s*a;
        printf("%d\n",c = s%1000);
    }
    return 0;
}

但是,long long根本不够用,如果支持的话,我当时想到用long long long long……
之后我改进了算法

二:我想到了题目既然要求输出最后结果的后3位,超过千位的运算其实都是没有意义的。

何不省略掉呢。这样有两个好处:第一,减小了运算量,第二防止了溢出。

再加上long long 我想可以AC了。见如下代码:

#include<stdio.h>
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        a = a%1000;
        long long s = 1;
        int c;
        for(int i=1; i<=b; i++)
            s = s*a;
        printf("%d\n",c = s%1000);
    }
    return 0;
}

令我没想到的是,居然有溢出了!!!或许你已经发现我傻傻的地方了。

三(AC):其实我去改变a的初值,为何不去改变计算过程中s的值呢?见如下代码:

#include<stdio.h>  
int main()  
{  
    int a,b;  
    while(~scanf("%d%d",&a,&b) && a && b)  
    {  
        long long s = 1;  
        int c;  
        for(int i=1; i<=b; i++)  
        {  
            s = s*a;  
            s = s%1000;  
        }  
        printf("%d\n",c = s%1000);  
    }  
    return 0;  
}

呵呵O(∩_∩)O,AC了!

顺便补充一下:要计算只包含加法、减法、乘法的整数表达式除以正整数n的余数,可以在每步之后对n取余,结果不变。

你可能感兴趣的:(1604 人见人爱A^B)