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
    • 循环的嵌套
    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    OpenWRT Mac 虚拟机PD 分享 for 软路由
    How to write u disk from img in mac os x
    linux find file > 100 M
    gojs for data flow
    正则表达式
    grep
    搜索引擎Query Rewrite
    Kafka replication
    cassandra写数据CommitLog
    Solr DIH JDBC 源码解析
  • 原文地址:https://www.cnblogs.com/siweihz/p/12187133.html
Copyright © 2011-2022 走看看