首页 > 编程语言 >请使用C++计算出2^2023与3^2023的和

请使用C++计算出2^2023与3^2023的和

时间:2023-07-07 23:55:39浏览次数:37  
标签:数组 大数 int res C++ vector 计算 2023 carry

易知,这个和的数字是非常大的,大到 long long 都装不下,这个时候如果使用 long long 是无法进行运算的。欸!这会高精度算法(即大数运算)就开始发光发热了。

以下是我看资料总结的一些歪瓜裂枣。

对于一位高精度数字,用整数数组存储,数组每一个元素对应一位十进制数,由其下标顺序指明位序号。
1、采用数串形式输入,并将其转化为整数数组。
2、用一个整数变量记录数据的实际长度(即数组的元素个数)
3、该数组的运算规则如同算术运算。

高精度加法的实现首先要注意的是,用数组的一位来存储数字的一位,把两个一位一位的相加,当两位数相加再加进位的数字大于等于10的时候就要进位,同时当前只保留个位数,保证每一位只有一位数字。

下面展示简单的输入和输出

void init(int i[])  //输入

{

        string k;

        cin>>k;

        i[0]=k.length();   //用i[0]计算字符串k的位数

        for(int j=0;j<=i[0];j++)

      {   i[j]=k[i[0]-j]-'0';    //将输入的字符串k转换为数字i,并倒序存储    }

}

 

void print(int i[ ])  //输出

{

        int j;

        if(i[0]==0)

       {     

              cout<<0<<endl;

              return;

       }

       for(j=i[0];j>0;j--)      //对应上面要倒序输出

       cout<<i[j];

       cout<<endl;

       return;

}

向量Vector是一个封装了动态大小数组的顺序容器。他和任意容器一样能够存放各种类型的对象。即可以简单的认为向量是一个能够存放任意类型的动态数组。

存储类型:

vector<类型>标识符

vector<类型>标识符(最大容量)

vector<类型>标识符(最大容量,初始所有值)

int i[5]={1,2,3,4,5}

vector<类型>vi(i,i+2);//得到i索引值为3以后的值

vector<vector<int>>v;

二维数组的定义方法如下

#include <bits/stdc++.h>
 using namespace std;
 int main()
 {
     int N=5, M=6;
     vector<vector<int> > obj(N, vector<int>(M)); //定义二维动态数组5行6列
  
     for(int i=0; i< obj.size(); i++)//输出二维动态数组
     {
         for(int j=0;j<obj[i].size();j++)
         {
             cout<<obj[i][j]<<" ";
         }
         cout<<"\n";
     }
     return 0;
 }             

具体代码和思路如下

主要分为大数相加、大数乘法函数和大数幂函数

1.大数相加

大数相加函数add的作用是将两个大数存储在vector中的数组进行相加。

  • 初始化进位carry为0,结果数组res为空。
  • 从大数的最低位开始逐位相加,同时考虑进位。
  • 将每一位的和取模10得到该位的数值,并将其添加到结果数组res中。
  • 将进位更新为当前和除以10的商。
  • 反转结果数组res
  • 返回结果数组res

2.大数乘法函数

大数乘法函数multiply的作用是将一个大数与一个整数因子相乘。

  • 初始化进位carry为0,结果数组res为空。
  • 从大数的最高位开始逐位相乘,同时考虑进位。
  • 将每一位乘积取模10得到该位的数值,并将其添加到结果数组res中。
  • 将进位更新为当前乘积除以10的商。
  • 当结束循环后,若进位不为0,则将进位的每一位依次添加到结果数组res中。
  • 反转结果数组res
  • 返回结果数组res

3.大数幂函数

大数幂函数power的作用是计算一个数字的大数幂。

  • 初始化结果数组res为1(即表示数字1)。
  • 进行exponent次循环,每次都将当前结果数组res与base相乘得到新的结果。
  • 返回结果数组res

 

#include <iostream>
#include <vector>

using namespace std;

// 大数相加函数
vector<int> add(vector<int>& num1, vector<int>& num2)
{
int carry = 0;
vector<int> res;
int i = num1.size() - 1;
int j = num2.size() - 1;

while (i >= 0 || j >= 0 || carry != 0) {
int sum = carry;
if (i >= 0) {
sum += num1[i];
i--;
}
if (j >= 0) {
sum += num2[j];
j--;
}
res.push_back(sum % 10);
carry = sum / 10;
}

reverse(res.begin(), res.end());
return res;
}

// 大数乘法函数
vector<int> multiply(vector<int>& num, int factor)
{
int carry = 0;
vector<int> res;

for (int i = num.size() - 1; i >= 0; i--) {
int product = num[i] * factor + carry;
res.push_back(product % 10);
carry = product / 10;
}

while (carry != 0) {
res.push_back(carry % 10);
carry /= 10;
}

reverse(res.begin(), res.end());
return res;
}

// 大数幂函数
vector<int> power(int base, int exponent)
{
vector<int> res;
res.push_back(1);

for (int i = 0; i < exponent; i++) {
res = multiply(res, base);
}

return res;
}

// 打印大数
void printNumber(vector<int>& num)
{
for (int i = 0; i < num.size(); i++) {
cout << num[i];
}
cout << endl;
}

int main()
{
vector<int> num1 = power(2, 2023);
vector<int> num2 = power(3, 2023);
vector<int> sum = add(num1, num2);

cout << "2^2023 + 3^2023 = ";
printNumber(sum);

return 0;
}

运行结果如下

2^2023 + 3^2023 = 164550155817497922294838391236299861450073375755268393204821647842390925231027327013362334261121620331320103763309030913468079478876131292912534405287849925398050388086112915948864401074633400938303521438749199299616760709734985020968176706423823045506812125521181906501625126248764139809149859309775005503946205345233873117543877759413080800290663648710104418064091162253163747353098015353006496073835480356649464016840990986871186086363748320458213967890316029657024181388800778492553133247539979368738270897979552321931107295913297764537663273094116306823891621840878523012417042704649200369167527343452009394046433911608627818498610240283001048499399739250672943345292236691272125995018337181697667450665219378815756991606386925778096374338455126384865122296761841414090781569213003224699667342691692380716557987838205129753879602803963110864426892507834007443857214407413528231854495781837278603865482642261573536273486496079316989840792161359098969978812807435

但是显然,结果不是这个,有哪位路过的大神可指点一二。感谢!

 

标签:数组,大数,int,res,C++,vector,计算,2023,carry
From: https://www.cnblogs.com/zongmeijiezuishuai/p/17536419.html

相关文章

  • 2023年7月7日,线程池的调用原理,线程池底层,任务队列
    线程池的调用原理线程池的七大参数:核心线程数、最大线程数、任务队列、拒绝策略、闲置时间、时间单位、线程工厂任务进入线程池后线程池的执行顺序:核心线程(用完)---处理完一个任务后会取出任务队列中的第一个任务来执行任务队列(装满)普通线程(用完)拒绝策略深入线程池ExecutorServicep......
  • 【热门技术】一文详细解读云计算
    ......
  • 2023-07-07:给出两个字符串 str1 和 str2。 返回同时以 str1 和 str2 作为子序列的最短
    2023-07-07:给出两个字符串str1和str2。返回同时以str1和str2作为子序列的最短字符串。如果答案不止一个,则可以返回满足条件的任意一个答案。输入:str1="abac",str2="cab"。输出:"cabac"。答案2023-07-07:大体步骤如下:1.初始化字符串str1和str2分别为"abac"......
  • 2023-07-07:给出两个字符串 str1 和 str2。 返回同时以 str1 和 str2 作为子序列的最短
    2023-07-07:给出两个字符串str1和str2。返回同时以str1和str2作为子序列的最短字符串。如果答案不止一个,则可以返回满足条件的任意一个答案。输入:str1="abac",str2="cab"。输出:"cabac"。答案2023-07-07:大体步骤如下:1.初始化字符串str1和str2分别为"abac"和"cab"......
  • 2023.7.7
    学习了java种的集合的基础部分,学习了java字符串的两道习题讲解,写了pta上的L1-009N个数求和,阅读了《大道至简》锻炼:哑铃和腹部训练问题:这个ptaL1-009N个数求和,其中写了一个函数longlonggcd(longlonga,longlongb){if(a%b==0)returnb;elseretur......
  • 2023.7.7 集训总结
    2023.7.7集训总结期末考试已经结束,文化课的同学们也已经放假,竞赛也停课集训了一段时间。现对这段时间的集训进行总结。CFCF的两场Div1或多或少地体现了我的缺陷:深入思考太慢,分析太久,在OI赛制可能还足够,但是在只有两个小时的CF赛制中却出现了问题,简单的T1要50分钟才能AC,导致T2......
  • 2023全新FL Studio 21中文版水果编曲制作软件下载安装教程
    音乐在人们心中的地位日益增高,近几年音乐选秀的节目更是层出不穷,喜爱音乐,创作音乐的朋友们也是越来越多,音乐的类型有很多,好比古典,流行,摇滚等等。对新手友好程度基本上在首位,电音类制作支持仅次于AbletonPush,调用音色和素材很方便。因此初学阶段以及对电音需求高、依赖素材偏多的制......
  • imazing是什么软件?2023年最新imazing2.17.6官网下载
    imazing是什么软件?iMazing是一款iOS设备管理软件,iPhone、iPad、iPod都可以使用。用iMazing可以对iOS系统设备进行数据传输与备份,可以管理相册照片、短信、通讯录、音乐、铃声等等,在Windows/Mac电脑中传输、备份也非常方便。为什么选择iMazingiMazing功能强大、易于使用,可以帮助您......
  • 20230706巴蜀暑期集训测试总结
    T1我是个大聪明!一眼矩乘。构造转移矩阵构造了3.5h!最开始以为只有\(15\times15\),直接手打。写到一半发现不一定四种颜色都有,是\(52\times52\)的,这时候狗被脑子吃了,还想手打,于是就打到了3h。差不多打了一大半,脑子终于把狗还回来了,意识到就算打完也不可能调得出来,就开始另辟蹊径,......
  • 20230707巴蜀暑期集训测试总结
    T1SPFA就能过!给我震惊到了。可以斜率优化。对每个站点维护一个凸包。\[f(x)=Ax^2+Bx+C\\dp_{v,q}=\min_{i=0}^{p}\{dp_{u,i}+f(p-i)\}\\(i,dp_{x,i}+Ai^2-Bi)\]T2考场想了想区间dp,有点思路但是时间不多了有点慌,打个暴搜直接跑。相当于将位置当作第二关键字比较,最大的数......