您的位置:首页 > 其它

1604 人见人爱A^B

2016-02-18 15:14 239 查看
首先让我感慨一下,这道题做的太爽了!并不是它用到了什么高级的知识点,而是因为脑洞大开啊!

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

这道题的重点解决就是第三个示例输入: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取余,结果不变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: