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

1.乍一看题目非常简单,简单思考一下,可以通过for循环实现:

#include <iostream>
using namespace std;
int main()
{
int num = 1;
for(int i=0;i<64;i++){
num *= 2;
} cout<<"2的64次方是"<<num;
return 0;
}

然而,代码运行后,得到的结果是0,什么?惊掉了下巴,居然不对?

程序运行后效果如下:

2.一番思考下来,应该是2的64次方超过int能表示的范围了,溢出了就输出0。

那么用long long存储怎么样呢?顺便输出2的1次方,直到2的64次方:

#include <iostream>
using namespace std;
int main()
{
long long num = 1;
for(int i=0;i<64;i++){
num *= 2;
cout<<"2的"<<i+1<<"次方是"<<":"<<num<<endl;
} cout<<"2的64次方是"<<num;
return 0;
}

程序运行后效果如下:

谁来拯救我,还是不对啊?

3.看来long long类型也无法解决溢出问题

回到问题本身,这是一个乘法计算,计算2的62次方得到 4611686018427387904,2的63次方,是这个数字乘以2已经溢出了。考虑一下,我们如何计算4611686018427387904*2=?

可以用字符数组存储这个数字,然后计算乘法就可以了。

#include<iostream>
using namespace std; int main(){
char n[32];
int a,b,jin=0; //初始化数组
n[0] = '1';
for(int i=1;i<32;i++){
n[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;
}
} cout<<"2的64次方是:";
for(int i=31;i>=0;i--){
cout<<n[i];
} return 0;
}

4.总结

通过该例子,可以学习:

  • 进一步理解intlong,每个类型的变量值是有范围的;
  • 可以通过数组,进行超大数字的+ - * /运算;
  • 数组定义及使用;
  • 字符和数字的转换,从数字0转换为字符'0',或者从字符'0'转换为数字0
  • 循环的嵌套

通过例子进阶学习C++(四)计算2的64次方,不服写写看的更多相关文章

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

    本文是通过例子学习C++的第五篇,通过这个例子可以快速入门c++相关的语法. 1.上篇回顾 在上一篇中,我们通过字符数组计算264次方: 通过例子进阶学习C++(四)计算2的64次方 带着这个问题:为 ...

  2. 通过例子进阶学习C++(七)CMake项目通过模板库实现约瑟夫环

    本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然 ...

  3. VUE 学习笔记 四 计算属性和监听器

    1.计算属性 对于任何复杂逻辑,你都应当使用计算属性 <div id="example"> <p>Original message: "{{ me ...

  4. 通过例子进阶学习C++(六)你真的能写出约瑟夫环么

    本文是通过例子学习C++的第六篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然后从出局的下一个人重新 ...

  5. ruby -- 进阶学习(四)paperclip上传中文命名图片

         Paperclip -- 上传中文命名图片 使用Paperclip和ImageMagick插件来处理图片的时候,上传非中文命名的图片时,只要把配置写好就没问题 if you need to ...

  6. python进阶学习(四)

    在使用多线程之前,我们首页要理解什么是进程和线程. 什么是进程? 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期.进程( ...

  7. MYSQL进阶学习笔记四:MySQL存储过程之定义条件,处理过程及存储过程的管理!(视频序号:进阶_11,12)

    知识点五:MySQL存储过程之定义条件和处理过程及存储过程的管理(11,12) 定义条件和处理: 条件的定义和处理可以用来定义在处理过程中遇到的问题时相应的处理步骤. DECLARE CONTINUE ...

  8. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  9. SODBASE CEP学习(四)续:类SQL语言EPL与Storm或jStorm集成-使用分布式缓存

    流式计算在一些情况下会用到分布式缓存,从而实现(1)想把统计或计算结果保存在分布缓存中.供其他模块或其他系统调用. (2)某一滑动时间窗体上计数.比如实时统计1小时每一个Cookie的訪问量.实时统计 ...

随机推荐

  1. springboot + rabbitmq发送邮件(保证消息100%投递成功并被消费)

    前言: RabbitMQ相关知识请参考: https://www.jianshu.com/p/cc3d2017e7b3 Linux安装RabbitMQ请参考: https://www.jianshu. ...

  2. H3C OSPF协议工作过程概述

  3. java List接口

    Collection子接口: List是有序的集合,集合中每个元素都有对应的顺序序列.List集合可使用重复元素,可以通过索引来访问指定位置的集合元素(顺序索引从0开始),List集合默认按元素的添加 ...

  4. P1026 翻硬币

    题目描述 小明正在玩一个"翻硬币"的游戏.桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如果 ...

  5. WPF 托盘显示

    本文告诉大家如何在 WPF 实现在托盘显示,同时托盘可以右击打开菜单,双击执行指定的代码 NotifyIcon WPF 通过 Nuget 安装 Hardcodet.NotifyIcon.Wpf 可以快 ...

  6. Linux 内核管理类

    一个类由一个 struct class 的实例来定义: struct class { char *name; struct class_attribute *class_attrs; struct c ...

  7. logisim自动生成电路

    之前再做有关logisim有关的实验时,一直在傻乎乎地连线,而我是看了mooc有关的视频时,才知道logisim有自动连线的功能. 自动连线需要事先知道输入与输出的真值表或者全部的表达式,将其填入lo ...

  8. Java 学习笔记(8)——匿名对象与内部类

    一般在编写代码时可能会遇到这样的场景--在某些时候,我需要定义并某个类,但是只会使用这一次,或者是某个类对象只会使用一次,为它们专门取名可能会显的很麻烦.为了应对这种情况,Java中允许使用匿名对象和 ...

  9. mac笔记本安装Android sdk

    一.先下载android sdk for mac   给二个靠谱的网址: a). http://down.tech.sina.com.cn/page/45703.html b). http://mac ...

  10. Hibernate各种查询方式及查询策略(转)

    转自:https://www.cnblogs.com/xujingyang/p/6734203.html 在了解Hibernate的基本知识后,重点让我们看下相关查询方式和查询优化策略吧! 话不多说, ...