通过例子进阶学习C++(五)计算2的1次方至2的64次方之和

时间:2023-03-08 23:56:19
通过例子进阶学习C++(五)计算2的1次方至2的64次方之和

本文是通过例子学习C++的第五篇,通过这个例子可以快速入门c++相关的语法。

1.上篇回顾

在上一篇中,我们通过字符数组计算264次方:

通过例子进阶学习C++(四)计算2的64次方

带着这个问题:为什么用字符数组,不用整数数组,开始本文。

2.先计算1+2+3+...100的和并总结规律

本题目直接实现,有点复杂,我们先计算1+2+3+...100的和,总结规律后再来计算。

这个是一个经典的循环问题,可以用for、while、do-while求和。

#include<iostream>
using namespace std; int main(){
int sum = 0;
for(int i=1;i<=100;i++){
sum += i;
}
cout<<"for求1+2+3+...+100之和是:"<<sum<<endl; sum = 0;
int t = 1;
while(t<=100){
sum += t;
t ++;
}
cout<<"while求1+2+3+...+100之和是:"<<sum<<endl; sum = 0;
t = 1;
do{
sum += t;
t ++;
}while(t<=100); cout<<"do-while求1+2+3+...+100之和是:"<<sum<<endl; return 0;
}

比较for、while和do-while的实现,我们发现累加求和的通用规则是在循环体中sum += t;从而实现累加求和的通用形式。

程序运行效果如下图:

通过例子进阶学习C++(五)计算2的1次方至2的64次方之和

3.计算21+22+23+24+...+264=?

该问题可以归为“算法”中的一类,称之为高精度计算。

当需要计算的两个数非常大,用字符数组存储,本文中分别用数组n计算2的次方,用sum数组存储和。

同2中的方法,求数组n和数组sum的和,只需要对应位求和即可。其中涉及的进位规则位,此处数组a,b,c均为整数数组

c[i]=a[i]+b[i];
if (c[i]>=10) { c[i]%=10; ++c[i+1]; }

实现代码如下:

#include<iostream>
using namespace std; int main(){
char n[32],sum[32];
int a,b,jin=0,temp=0; //初始化数组
n[0] = '1';
for(int i=1;i<32;i++){
n[i] = '0';
} //初始化求和数组
for(int i=0;i<32;i++){
sum[i] = '0';
} //循环64次,每次数组的值乘以2
for(int j=0;j<64;j++){
jin = 0;
//从最低位开始,计算乘以2后各个位上的值:`当前值*2+进位`,然后转换为字符
for(int i=0;i<32;i++){
a = (n[i]-'0') * 2;
n[i] = a%10 + jin + '0';
jin = a/10;
} //求和
jin = 0;
for(int k=0;k<32;k++){
temp = sum[k] - '0' + n[k] - '0' + jin;
sum[k] = temp % 10 + '0'; if(temp>=10){
jin = temp /10;
}else{
jin = 0;
}
}
} cout<<"2的1次方+2的2次方+...2的64次方的和是:";
for(int i=31;i>=0;i--){
cout<<sum[i];
} return 0;
}

程序运行后效果如下:

通过例子进阶学习C++(五)计算2的1次方至2的64次方之和

4.总结

上述实现方法远非最优,通过该例子,可以学习:

  • 数组定义、初始化、使用;
  • 通过for、while、do-while实现求和,发现其异同之处;
  • 通过字符数组,高精度运算;

    加油,我相信你可以写的出来的!