高精度次方计算

107 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情


大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

-   CSDN C/C++领域新星创作者<https://blog.csdn.net/chuxinchangcun?type=blog>
-   掘金LV3用户 <https://juejin.cn/user/1381426159953960>
-   阿里云社区专家博主,星级博主,技术博主 <https://developer.aliyun.com/profile/expert/5lkdbuggiiuhc>
-   华为云云享专家 <https://bbs.huaweicloud.com/community/myhomepage>

![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f64347b0ce4c4e429b4d8adb93950e76~tplv-k3u1fbpfcp-watermark.image?)

***

### 思想:

**用数组存放对应数据的商和余数,方便计算很大的数,如4的444次方等**

### 步骤:


一.开辟一个较大的数组,数组的元素最初初始化为0,数组的最后一个元素初始化为1(或者第一个元素初始化为1,如果是第一个元素初始化为1的话,就往数组下面进位,如果是最后一位元素初始化为1,那就数组上进位)

二.进行循环计算和进位判断,循环次数为指数的大小,

对于每一轮循环:

1.遍历数组,数组的每一位元素都乘以底数

2.遍历数组,判断数组对于位置的值是否大于10,若大于则进位到数组前一个位置

三.找到数组中对于的值开始不为0处的下标,从此处开始向后打印

***

### 图解

![image-20220210164859226](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b929a82a25cd4c6da5d906c43b690fed~tplv-k3u1fbpfcp-zoom-1.image)

### 代码

计算的是a的b次方,所以外层循环由b(指数)控制,循环内部乘的是a(底数)

```
int main()
{
    int arr[1000] = {0};    //用于存放计算的数据,初始化为0
    arr[999] = 1;   //最初:数组最后一个元素定义为1
    int i = 0;
    int N = 0;//底数
    int M = 0;//指数
    printf("请输入底数:");
    scanf("%d",&N);
    printf("请输入指数:");
    scanf("%d",&M);
    //有1000个元素,最后一个元素下标为:999
    for(i = 0 ;i < M;i++)
    {
        int j = 0;
        for(j = 999;j>=0;j--)
        {
            arr[j] *=N; //数组中的每一位元素都乘以底数
            //最初只有数组最后一位乘了,因为其他位全为0
        }
         for(j = 999;j>=0;j--)
         {
             //如果数组中的元素大于等于10就进位,把余数放到本身,商放到上一个位置
             if(arr[j] >= 10)
             {
                 arr[j-1] += arr[j]/10;//商进位到上一个位置
                 arr[j] = arr[j] %10;//本身位置取余数
             }
         }
    }
    //最后遍历数组找到数组元素第一个不为0的位置
    int index = 0;
      for (i = 0; i < 1000; i++)
      {
         if (arr[i] == 0 && arr[i + 1] != 0)
        {
             //i+1位置元素不为0
            index = i + 1;
            break;
        }
      }
    //把前面的所有0不输出,从index位置开始才输出
        for (i = index; i < 1000; i++)
        {
             printf("%d", arr[i]);
        }
    return 0;
}
```

***

### 注意

1.数组每个数乘底数 以及 数组每个数进行判断都是分开两个循环,遍历数组

2.  arr[j-1] += arr[j]/10; 是把余数+到前一个位置,是+= 不是=

***