高精度次方计算
【摘要】 大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog掘金LV3用户 https://juejin.cn/us...
大家好,我是芒果,一名非科班的在校大学生。对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
思想:
用数组存放对应数据的商和余数,方便计算很大的数,如4的444次方等
步骤:
一.开辟一个较大的数组,数组的元素最初初始化为0,数组的最后一个元素初始化为1(或者第一个元素初始化为1,如果是第一个元素初始化为1的话,就往数组下面进位,如果是最后一位元素初始化为1,那就数组上进位)
二.进行循环计算和进位判断,循环次数为指数的大小,
对于每一轮循环:
1.遍历数组,数组的每一位元素都乘以底数
2.遍历数组,判断数组对于位置的值是否大于10,若大于则进位到数组前一个位置
三.找到数组中对于的值开始不为0处的下标,从此处开始向后打印
图解
代码
计算的是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.数组每个数乘底数 以及 数组每个数进行判断都是分开两个循环,遍历数组
- arr[j-1] += arr[j]/10; 是把余数+到前一个位置,是+= 不是=
\
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)