高精度次方计算

举报
芒果_Mango 发表于 2022/04/30 22:56:38 2022/04/30
6.5k+ 0 0
【摘要】 大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog掘金LV3用户 https://juejin.cn/us...

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

作者简介:

image.png


思想:

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

步骤:

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

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

对于每一轮循环:

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

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

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


图解

image-20220210164859226

代码

计算的是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.数组每个数乘底数 以及 数组每个数进行判断都是分开两个循环,遍历数组

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

\

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。