zoukankan      html  css  js  c++  java
  • 2的N次方求解-----C++

    2的N次方求解,一般情况如果不超出C/C++基本数据类型的表达范围,这个问题及其容易,但是如果N的值十分的大,以致于超出基本数据类型表达范围

    下面的程序正是解决2的N次方这个大数精确求解的源码

     1 #include <iostream>
     2 #include <vector>
     3 #include <fstream>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int N = 512;//2的N次方是超过基本数据类型所能表达的范围
     9 
    10     vector<int> result;//使用vector来保存结果,这里可以使用char来保存
    11     result.push_back(1);//首先起始为1
    12     vector<int>::iterator it;//定义迭代器
    13 
    14     for (int i = 1; i <= N; i++)
    15     {
    16         for (it = result.begin(); it != result.end(); it++)//所得每一位*2
    17         {
    18             *it = (*it) * 2;
    19         }
    20         for (size_t i = 0; i < result.size(); i++)//判断每一位
    21         {
    22             if (result[i] > 9)//如果该为>=10
    23             {
    24                 if (i == result.size() - 1)//如果是最高位
    25                 {
    26                     result.push_back(result[i] / 10);//增加一位
    27                 }
    28                 else
    29                 {
    30                     result[i + 1] += result[i] / 10;//进位
    31                 }
    32                 result[i] %= 10;//进位之后本位处理
    33             }
    34         }
    35     }
    36 
    37     //写入文件
    38     ofstream out;
    39     out.open("result.txt", ios::out | ios::trunc);
    40 
    41     if (!out.is_open())
    42     {
    43         cout << "open error";
    44         return -1;
    45     }
    46     for (int i = result.size() - 1; i > -1; i--)//存储和自然读数顺序相反
    47     {
    48         out << result[i];
    49         cout << result[i];
    50     }
    51 
    52     out.close();
    53     cout << endl;
    54 
    55     system("pause");
    56     return 0;
    57 }

    程序运行结果:

    2512=13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096

    下面是win10计算器计算的结果:

     -----------------------------------------------------------------------------------------------------------------------------------------------------------

    这个程序只要稍加修改即可变成阶乘大数的求法

     for (it = result.begin(); it != result.end(); it++)//所得每一位*2
     {
    *it = (*it) * 2;//将2修改为i---->*it = (*it) * i;
    }
  • 相关阅读:
    Oracle条件分支查询
    Oracle分组函数实例
    使用JDK合成照片
    Oracle存储过程记录异常日志
    Emmet Cheat Sheet(Sublime编辑)
    JS中级
    JS中级
    架构师必须知道的架构设计原则
    JS中级
    JS中级
  • 原文地址:https://www.cnblogs.com/SimonKly/p/7545976.html
Copyright © 2011-2022 走看看