通过例子进阶学习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;从而实现累加求和的通用形式。

程序运行效果如下图:

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;
}

程序运行后效果如下:

4.总结

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

  • 数组定义、初始化、使用;
  • 通过for、while、do-while实现求和,发现其异同之处;
  • 通过字符数组,高精度运算;
    加油,我相信你可以写的出来的!
所有文章,坚持原创。如有转载,敬请标注出处。
原文地址:https://www.cnblogs.com/siweihz/p/12194119.html