通过例子进阶学习C++(四)计算2的64次方,不服写写看
本文是通过例子学习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.总结
通过该例子,可以学习:
- 进一步理解
int,long,每个类型的变量值是有范围的; - 可以通过数组,进行超大数字的
+ - * /运算; - 数组定义及使用;
 - 字符和数字的转换,从数字
0转换为字符'0',或者从字符'0'转换为数字0; - 循环的嵌套
 
通过例子进阶学习C++(四)计算2的64次方,不服写写看的更多相关文章
- 通过例子进阶学习C++(五)计算2的1次方至2的64次方之和
		
本文是通过例子学习C++的第五篇,通过这个例子可以快速入门c++相关的语法. 1.上篇回顾 在上一篇中,我们通过字符数组计算264次方: 通过例子进阶学习C++(四)计算2的64次方 带着这个问题:为 ...
 - 通过例子进阶学习C++(七)CMake项目通过模板库实现约瑟夫环
		
本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然 ...
 - VUE 学习笔记 四 计算属性和监听器
		
1.计算属性 对于任何复杂逻辑,你都应当使用计算属性 <div id="example"> <p>Original message: "{{ me ...
 - 通过例子进阶学习C++(六)你真的能写出约瑟夫环么
		
本文是通过例子学习C++的第六篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然后从出局的下一个人重新 ...
 - ruby -- 进阶学习(四)paperclip上传中文命名图片
		
Paperclip -- 上传中文命名图片 使用Paperclip和ImageMagick插件来处理图片的时候,上传非中文命名的图片时,只要把配置写好就没问题 if you need to ...
 - python进阶学习(四)
		
在使用多线程之前,我们首页要理解什么是进程和线程. 什么是进程? 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期.进程( ...
 - MYSQL进阶学习笔记四:MySQL存储过程之定义条件,处理过程及存储过程的管理!(视频序号:进阶_11,12)
		
知识点五:MySQL存储过程之定义条件和处理过程及存储过程的管理(11,12) 定义条件和处理: 条件的定义和处理可以用来定义在处理过程中遇到的问题时相应的处理步骤. DECLARE CONTINUE ...
 - C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
		
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
 - SODBASE CEP学习(四)续:类SQL语言EPL与Storm或jStorm集成-使用分布式缓存
		
流式计算在一些情况下会用到分布式缓存,从而实现(1)想把统计或计算结果保存在分布缓存中.供其他模块或其他系统调用. (2)某一滑动时间窗体上计数.比如实时统计1小时每一个Cookie的訪问量.实时统计 ...
 
随机推荐
- Python--day20--序列化模块
			
序列化:转向一个字符串数据类型 序列 ———— 字符串 序列化和反序列化的概念: 序列化三种方法:json pickle shelve json模块:json模块提供了四个方法dumps和load ...
 - css模仿ipad的日历
			
https://www.cnblogs.com/sandraryan/ 题外话之:最近的练习用js之类的写起来会简单点,但是为了巩固基础,只好html和css硬怼页面X﹏X 这是一个日历的代码 注释有 ...
 - CSS 伸缩布局
			
转载于:https://blog.csdn.net/weixin_41342585/article/details/80140513 1. flex-direction:设置伸缩容器中成员的排列方式 ...
 - Django入门8--Templates过滤器
			
过滤器大大减少了开发的代码量
 - window 系统下修改`CMD`的编码格式的方法,`CHCP` 的 使用
			
CHCP的使用 CHCP是一个计算机指令,能够显示或设置活动代码页编号. 一般上是在命令提示框中使用,用来查询和修改命令提示框的编码格式 具体使用方法 查看活动代码页编号 方式1: >>& ...
 - java Scanner(简单文本扫描器)
			
Scanner(File source) 构造一个新的 Scanner,它生成的值是从指定文件扫描的. 备注:实现了Iterable接口 package june6D; import java. ...
 - 2018-11-2-win10-uwp-通过-win2d-画出笔迹
			
title author date CreateTime categories win10 uwp 通过 win2d 画出笔迹 lindexi 2018-11-2 20:11:0 +0800 2018 ...
 - nor flash之频率限制
			
背景 支持一款nor flash时,出于性能考虑,一般会查看其nor支持的最高频率以及主控端spi控制器的最高频率,以选择一个合适的运行频率. 对于一款主控支持多款flash的情况,还得考虑好兼容性等 ...
 - 神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(二)
			
开心一刻 一头母牛在吃草,突然一头公牛从远处狂奔而来说:“快跑啊!!楼主来了!” 母牛说:“楼主来了关我屁事啊?” 公牛急忙说:“楼主吹牛逼呀!” 母牛大惊,拔腿就跑,边跑边问:“你是公牛你怕什么啊? ...
 - ELK学习实验002:Elasticsearch介绍及单机安装
			
一 简介 ElasticSearch是一个基于Luncene的搜索服务器.它提供了一个分布式多用户能力全文搜索引擎,基于RESTful web接口,ElsticSearch使用Java开发的,并作为A ...