通过例子进阶学习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 ...
随机推荐
- Codeforces Round #190 (Div. 1 + Div. 2)
A. Ciel and Dancing 模拟. B. Ciel and Flowers 混合类型的数量只能为0.1.2,否则3个可以分成各种类型各自合成. C. Ciel and Robot 考虑一组 ...
- Python--day43--连表查询(重要)
- word 筛选过的网页,网页,单个文件网页
1)筛选过的网页:保存后会生成 xxx.htm和xxx.files文件夹,删除了还原成Word文档所需的格式标记和功能,也就是说存为纯网页了,文件尺寸小:2)网页:保存后会生成 xxx.htm和xxx ...
- H3C IPv6邻居发现协议
- 2019-8-31-AutoHotKey-用打码的快捷键
title author date CreateTime categories AutoHotKey 用打码的快捷键 lindexi 2019-08-31 16:55:58 +0800 2019-06 ...
- Dbvisualizer各种中文乱码问题解决方法
1.SQL Commander里中文显示成‘口’ 解:进入Tools -> Tool Properties -> General -> Appearence -> Fonts, ...
- linux 从用户空间的 I/O 存取
刚刚描述的这些函数主要打算被设备驱动使用, 但它们也可从用户空间使用, 至少在 PC- 类 的计算机. GNU C 库在 <sys/io.h> 中定义它们. 下列条件应当应用来对于 inb ...
- 【74.00%】【codeforces 747A】Display Size
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 51nod 天气晴朗的魔法 - (Kruskall最小生成树)
题目: 基准时间限制:1 秒 空间限制:131072 KB 51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动. N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的魔力连接 ...
- es6笔记 day2---函数默认参数、箭头函数、剩余参数
函数变化: 1.函数默认参数 2.函数参数默认是已经定义了,不能再使用let.const声明 3.扩展运算符.rest运算符 ...就是扩展运算符,它的作用就是把数组给展开 结合函数使用传参,也可以将 ...