zoukankan      html  css  js  c++  java
  • 通过例子进阶学习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.总结

    通过该例子,可以学习:

    • 进一步理解intlong,每个类型的变量值是有范围的;
    • 可以通过数组,进行超大数字的+ - * /运算;
    • 数组定义及使用;
    • 字符和数字的转换,从数字0转换为字符'0',或者从字符'0'转换为数字0
    • 循环的嵌套
    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    MySQL 5.7 多主一从实现
    从 MySQL 全备的 SQL 文件中抽离出某张表的数据
    KUBERNETES 03:Pod 资源清单
    KUBERNETES 02:基本操作命令
    KUBERNETES 01:说明与安装
    DOCKER 08:搭建本地镜像仓库 Harbor
    DOCKER 07:docker swarm
    DOCKER 06:docker compose
    DOCKER 05:数据持久化
    DOCKER 04:容器资源限制和网络原理
  • 原文地址:https://www.cnblogs.com/siweihz/p/12187133.html
Copyright © 2011-2022 走看看