通过例子进阶学习C++(五)计算2的1次方至2的64次方之和
本文是通过例子学习C++的第五篇,通过这个例子可以快速入门c++相关的语法。
1.上篇回顾
在上一篇中,我们通过字符数组计算264次方:
带着这个问题:为什么用字符数组,不用整数数组,开始本文。
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实现求和,发现其异同之处;
- 通过字符数组,高精度运算;
加油,我相信你可以写的出来的!
通过例子进阶学习C++(五)计算2的1次方至2的64次方之和的更多相关文章
- 通过例子进阶学习C++(七)CMake项目通过模板库实现约瑟夫环
本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然 ...
- 通过例子进阶学习C++(四)计算2的64次方,不服写写看
本文是通过例子学习C++的第四篇,通过这个例子可以快速入门c++相关的语法. 1.乍一看题目非常简单,简单思考一下,可以通过for循环实现: #include <iostream> u ...
- 通过例子进阶学习C++(六)你真的能写出约瑟夫环么
本文是通过例子学习C++的第六篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然后从出局的下一个人重新 ...
- ruby -- 进阶学习(五)使用Ckeditor插件上传中文图片
基于rails4.0环境 当使用Ckeditor上传中文命名图片时报错,解决方法是对图片进行重命名 在Ckeditor插件的安装目录下找到controllers/.../application.rb ...
- MYSQL进阶学习笔记五:MySQL函数的创建!(视频序号:进阶_13)
知识点六:MySQL函数的创建(13) 内置函数: 自定义函数: 首先查看是否已经开启了创建函数的功能: SHOW VARIABLES LIKE ‘%fun%’; 如果变量的值是OFF,那么需要开启 ...
- Libevent学习笔记(五) 根据例子学习bufferevent
libevent中提供了一个Hello-world.c 的例子,从这个例子可以学习libevent是如何使用bufferevent的. 这个例子在Sample中 这个例子之前讲解过,这次主要看下buf ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- 文本分类学习 (五) 机器学习SVM的前奏-特征提取(卡方检验续集)
前言: 上一篇比较详细的介绍了卡方检验和卡方分布.这篇我们就实际操刀,找到一些训练集,正所谓纸上得来终觉浅,绝知此事要躬行.然而我在躬行的时候,发现了卡方检验对于文本分类来说应该把公式再变形一般,那样 ...
- PostgreSQL学习手册(五) 函数和操作符
PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是Post ...
随机推荐
- js对数组的元素分割
文章地址 https://www.cnblogs.com/sandraryan/ 不用方法(模拟方法) <script> var arr = ["hi",2,3,tru ...
- Python--day25--复习(单继承和多继承的总结)
- vue v-for循环中key属性的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 关于Android studio Haxm加速器安装
首先,在SDK manager中要安装如下选项 安装后,在启动虚拟机时如果提示你没有Install Haxm,在目录sdk\extras\intel\Hardware_Accelerated_Exec ...
- 12563 - Jin Ge Jin Qu hao——[DP递推]
(If you smiled when you see the title, this problem is for you ^_^) For those who don’t know KTV, se ...
- Spring Security 5中 PasswordEncoder的使用
在最新的 Spring Security 5发布版本中, 出于安全性的考虑调整了PasswordEncoder的实现与使用策略. 1.以前常用的实现 StandardPasswordEncoder, ...
- HDU 1711 Number Sequence (KMP 入门)
Number Sequence Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and ...
- linux 操作 I/O 端口
在驱动硬件请求了在它的活动中需要使用的 I/O 端口范围之后, 它必须读且/或写到这些 端口. 为此, 大部分硬件区别 8-位, 16-位, 和 32-位端口. 常常你无法混合它们, 象你 正常使 ...
- Canvas文本设置
本文的应用对Canvas文本设置相关属性进行了汇总,具体使用说明请参考下面代码: <!DOCTYPE html> <html lang="zh"> < ...
- How to parse version range
Now we are making a solution that has to get the package reference. But the version of package refer ...