通过例子进阶学习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 ...
随机推荐
- 模板——伸展树 splay 实现快速分裂合并的序列
伸展操作:将treap中特定的结点旋转到根 //将序列中从左数第k个元素伸展到根,注意结点键值保存的是原序列id void splay(Node* &o, int k) { ] == NULL ...
- H3C 单区域OSPF配置示例一
- java Eclipse的使用技巧
eclipse与myeclipse的关系(都属于java开发的工具): 后者是前者的一个插件,后来为了方便使用,myeclipse集合了eclipse,后者是收费的. 可大部分人都是用 eclipse ...
- vuex 快速上手,具体使用方法总结(含使用例子)
网上有关vuex的文章很多,但有些比较复杂,这篇文章能让你快速使用vuex: vuex 用处:管理全局状态(类似全局变量,每个组件都能访问到) vuex 用法: //下面是一个js文件,用最简单最全的 ...
- H3C 三种生成树协议特性的比较
- Teleport ultra/IDM(Internet Download Manager)
神器扒网站——teleport ultra IDM(Internet Download Manager) 在平时的开发或者学习的过程中,我们难免会看到一些让人心动的网站,于是自己想把它搞下来,自己手工 ...
- jquery自己写的带左右箭头自动播放幻灯插件,简化
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- vue-learning:4-template-v-if-and-v-show
控制元素可见性的指令 v-if 和 v-show v-if v-else v-else-if :多重判断 template :分组渲染包裹元素 key:管理可复用元素 v-show v-if与v-sh ...
- c# 写个简单的爬虫。注:就一个方法,没有注释,自己猜~哈哈
和我,在成都的街头走一走,哦~喔~哦~ public JsonResult GetHtml() { string url = "http://www.xxxxxxxxxxxxxxxxxx.c ...
- Mac Tab自动补全键
最近入手一个Mac(Mac 2019版本),在使用终端时,发现不能使用Tab键自动补全代码,网络搜寻下,发现这里有个方法,记录下,免得自己忘记: 1 / 首先找到这个图标 2 / 输入命令 nano ...