核心算法:
将问题进行拆分
- 求一个数的任意次方:x^y
在C语言规定的运算符中,^为按位异或运算符,而没有特定表示幂指的运算符,所以我们要求x ^y,只能通过以下方式:
①利用循环结构,将幂指运算转化为乘法运算
for(i=1;i<=y;i++) z=z*x; 【unsigned int x,unsigned int y】
②调用数学函数,头文件为<math.h>乘幂函数:double pow(double x,double y)
以e为底的指数函数:double exp(double y)
- 求一个数的后三位:取余
如果前者为较小的数,后者为较大的数,那么结果直接为较小的数。
详见C语言取余
①利用取模运算符:z%1000
【只有两个整型数据之间才可以进行模运算,int z,但后者不能为0,参与模运算的两个数可正可负,余数的符号与前者的符号相同】
②调用取余函数:double fmod(doube x,double y)
【可以对浮点型数据进行取模运算,后者可以为0,此时函数返回值为NAN,两个数据可正可负,浮点余数的符号与前者x的符号相同】
注意:
题中要求一个数的任意次方,首先要考虑计算结果是否越界,如何避免越界问题同时又不使结果产生误差,这里在求次方时每乘一次都取其后三位的值,这样就不会出现越界问题,又可完成题目要求。
例:编程求一个整数任意次方后的最后三位数,即求x^y的最后三位数,x和y的值由键盘输入。
#include<stdio.h>
int main()
{
int i,x,y,z=1;
printf("请输入两个数,x和y(x^y):\n");
scanf("%d%d",&x,&y);
for(i=1;i<=y;i++)/*计算一个数任意次方的后三位*/
z=z*x%1000;/*直接求后三位数值的任意次方即可*/
if(z>=100)/*如果有三位数*/
printf("%d^%d的最后三位是:%d\n",x,y,z);
else if(z>=10)/*如果只有两位数*/
printf("%d^%d的最后三位是:0%d\n",x,y,z);
else /*如果只有一位数*/
printf("%d^%d的最后三位是:00%d\n",x,y,z");
return 0;
}