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取余,结果不变。

浙公网安备 33010602011771号