【题目描述】
给出一个整数aa和一个正整数n(−1000000≤a≤1000000,1≤n≤10000)n(−1000000≤a≤1000000,1≤n≤10000),求乘方anan,即乘方结果。最终结果的绝对值不超过10000001000000。
【输入】
一行,包含两个整数aa和nn。−1000000≤a≤1000000,1≤n≤10000−1000000≤a≤1000000,1≤n≤10000。
【输入样例】
2 3
【输出】
8
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a,n;
int s=1;
cin>>a>>n;
for(int i=0;i<n;i++)
{
s*=a;
}
cout<<s;
return 0;
} 本文来自投稿,不代表本站立场,如若转载,请注明出处:

这题不就是个循环乘嘛,有啥好单独开一篇讲的?但负数次幂咋办,题目都没提,真服了。
这题我儿子最近刚做到,结果他跑来问我,我说这还不简单,循环乘呗。他反手给我看题里那句话——“最终结果的绝对值不超过1000000”,我当时就愣了,那你还让a最大到1000000,n最大到10000,这不扯淡吗?2的20次方就超过100万了,后面那些测试点是不是都拿小数据糊弄人啊?真服了,出题人写个限制条件跟闹着玩似的。 不过话说回来,这题本身确实没啥可讲的,就是让练个循环。但我家孩子非要问有没有更快的办法,说老师讲的是直接for循环乘n次。我寻思n最大一万,乘一万次也没啥,但要是n再大点呢?比如a等于1的时候,你循环一万次不傻吗?直接判断a是不是1或者-1不完了?还有a等于0的情况,n是正整数,那结果就是0,也白乘。虽然这题数据小,暴力能过,但老师要是只教死循环,学生脑子就废了。 我当年学这个的时候,老师还专门讲了个快速幂,说递归啊二进制啊啥的,当时听得迷迷糊糊,后来自己琢磨通了其实就是把指数拆成二进制,比如算3的5次方,5是101,那就是3的4次方乘3的1次方,这样乘的次数少多了。但你说这题n才一万,快速幂反而显得小题大做。不过我觉得吧,信息学奥赛本来就是要培养思维,不是让你照着题目的数据范围凑个能过的代码就完事。你要是只为了过这道题,那确实简单,但后面遇到大指数你就傻了。 还有那个输出,题目说最终结果绝对值不超过1000000,那int就够了,但我不明白为啥还要强调这个,是怕有人用long long吗?还是说防止有人把a和n的范围搞混?反正我儿子第一次写的时候直接用了int,没问题。但我看到评论区有人问如果a是负数怎么办,n是奇数结果就是负的,这题里也没特别说明,但试一下样例就知道了,不算坑。 最让我无语的是这破题描述,写的“给出一个整数aa和一个正整数n”,这个aa是啥,复制粘贴过来的吧?还有“求乘方anan”,是不是该是a的n次方?排版都乱了。不过教材嘛,错别字在所难免,就是看着难受。总的来说,这道题适合刚学循环的新手,但别指望它能帮你拿到什么奖,纯属基础中的基础。你要是想给孩子讲点有意思的,不如顺便说说怎么处理大数,或者指数爆炸,别整天就那几道入门题翻来覆去。行了,吐槽完毕,带孩子刷下一题去了。