如何将argv字符串更改为大数字的长整数

how to change argv string to long integer for quite big number

本文关键字:数字 长整数 argv 字符串      更新时间:2023-10-16

我有疑问,这是一个可以从终端更改输入的代码,但由于输入来自argv,即字符串,我需要将字符串更改为长整数,当输入很大时,它不会产生正确的结果。如何解决这个问题?

/k解码E输出:4

/k编码10输出:BB

这产生了正确的结果

例如,当输入为"encode"时,"27691003381892347981273765782346987671864198764978136146376495409880251876462823746723173628347582973485972834752784935773114658736582736458972634785"它产生错误的结果

#include <stdio.h>
#define ll long long int
#include <queue>
#include <vector>
#include <iostream>
#include <bits/stdc++.h>
#include <string.h>
using namespace std;
char arr[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I' };
ll decode(string k);
string encode(ll n);
void align(string k);
int main(int argc, char* argv[])
{
// start from 1 to ignore script name; argv[0] will be a name of processing file.
if (strcmp(argv[1], "decode") == 0) {
string p = argv[2];
ll total = decode(p);
cout << total << "n";
}
else if (strcmp(argv[1], "encode") == 0) {
long int yu = strtol(argv[2],NULL,10);
string str=encode(yu);
cout<<str<<endl;
}else if(strcmp(argv[1],"align")==0){
string k=argv[2];
align(k);
}
return 0;
}

string encode(ll n)
{   int i = 0;
string str="";
// array to store binary number
long binaryNum[1000];
if(n==0){
binaryNum[0]=0;
i++;
}
// counter for binary array
while (n > 0) {
// storing remainder in binary array
binaryNum[i] = n % 9;
n = n / 9;
++i;
}

long lo;
// printing code array in reverse order
for (int j = i - 1; j >= 0; j--) {
lo = binaryNum[j];
str+=arr[lo];
//cout << arr[lo];
}
return str;
}

,但由于输入来自argv,即字符串,因此我需要更改字符串到长整数,当输入很大时,它不会产生正确的结果。如何解决这个问题?

没有修复。

最大的C++整数(对于大多数桌面系统(是具有8个字节的uint64_t(sizeof(uint64_t)报告为8(。

UINTMAX_MAX(在<cstdint>中定义(是适用于uint64_t的最大整数,并且只需要20个十进制数字来描述64位。

您根本无法将152位十进制数字497位转换为64位(最多可包含20位十进制数字描述的值(。


您可能希望研究多精度库。

我最喜欢的是GMP。它提供了一个mpz_class(在<gmpxx.h>标头中(来处理整数。

使用mpz_class,我有代码可以生成45151个十进制数字来描述12345!(阶乘(,具有出色的性能。