我有一个带有大整数的小代码:
int main()
{
mpz_clears;
mpf_clears;
mpz_class a;
a=130637788386308069046861449260260571291678458515671364436805375996643405376682659882150140370119739570729696093810308688223886144781635348688713392214619435345787110033188140509357535583193264801721383236152235906221860161085667905721519797609516199295279707992563172152784123713076584911245631751842633105652153513186684155079079372385923352208421842040532051768902602579344300869529063620569896872621227499787666438515766191438772844982077590564825560915004123788524793626088046688154064374425340131073611440941376503643793012676721171310302652283866154666880487476095144107907540698417260347310774677574064007810935083421437442654204085311165490420993090855747058348793757769523336364858305492927387281493416741250273266926840468154062676311322374882380011804120628601384191;
return 0;
并得到了这个错误,所以我不能对整数做任何事......
error: integer literal is too large to be represented in any
integer type
我在Mac上,使用xcode工具编译并使用最后一个6.0.0a gmp库。
我错过了什么?
答案 0 :(得分:1)
使用GMP并不能让C / C ++理解大于基本语言规范的文字。幸运的是,C ++ 11具有用户定义的文字GMP has a literal syntax defined,因此文字类型为mpz_class
而不是int
。只需将_mpz
添加到整数文字的末尾,例如
a=130637788386308069046861449260260571291678458515671364436805375996643405376682659882150140370119739570729696093810308688223886144781635348688713392214619435345787110033188140509357535583193264801721383236152235906221860161085667905721519797609516199295279707992563172152784123713076584911245631751842633105652153513186684155079079372385923352208421842040532051768902602579344300869529063620569896872621227499787666438515766191438772844982077590564825560915004123788524793626088046688154064374425340131073611440941376503643793012676721171310302652283866154666880487476095144107907540698417260347310774677574064007810935083421437442654204085311165490420993090855747058348793757769523336364858305492927387281493416741250273266926840468154062676311322374882380011804120628601384191_mpz;
答案 1 :(得分:0)
C ++类型无法处理您传递的大数字并抛出该错误。
详细信息请参阅此答案。 What range of values can integer types store in C++
并在文件中清楚地提到了这一点。
构造一个mpz_class。除了long long和long double之外,可以使用所有标准C ++类型,并且可以使用所有GMP C ++类,尽管mpq_class和mpf_class的转换是显式的。任何必要的转换都遵循相应的C函数,例如double跟随mpz_set_d(参见赋值整数)。
答案 2 :(得分:0)
仅仅因为你使用一个大整数类并不意味着编译器会突然变得能够使用超大整数文字。像往常一样,编译器将无后缀文字视为int
。它对于int
来说太大了。
您应该使用C ++ 11文字支持并使用_mpz
后缀提供您的文字值,或者将您的值表示为字符串。
答案 3 :(得分:0)
好吧,即使使用_mpz选项,您可以分配的位数也可能有限制。我将数字减少到这个数字,我可以存储整数:
1306377883863080690468614492602605712916784585156713644368053759966434053766826598821501403701197395707296960938103086882238861447816353486887133922146194353457871100331881405093575355831932648017213832361522359062218601610856679057215197976095161992952797079925631721527841237130765849112456317518426331056521535131866841550790793723859233522084218420405320517689026025793443008695290636205698968726212274997876664385157661914387728449820775905648255609150041237885247936260880466881540643744253401310736114409413765036437930126767211713103026522838661546668804874760951441079075406984172603473107746775740640078109350834214374426542040853111654904209930908557470583487937577695233363648583054929273872814934167412502732669268404681540626763113223748823800118041206286013841914438857151609189388944789912125543384749359092744422082802260203323027106375022288131064778444817003723336406042118742608383328221769687812353049623008802672211104016065088809718347778314022490821844106377494000232824192 70071233303228854128584088916313729295257781669730936517951304701393525757057288415991731506781288275420005462290126288405806701552761743270631625705587885293887371663631869096785158480771725887503591755610
答案 4 :(得分:-1)
要使用大数字操作,最好先查看加密软件,例如openssl/bn.h
$ sudo apt-get install libssl-dev
MUL.cpp
#include <openssl/bn.h>
#include <ctime>
#include <string>
#include <stdio.h>
#include <iostream>
#include <time.h>
using namespace std;
// man bn
int main(int argc, char *argv[]) {
BN_CTX *ctx = BN_CTX_new( );
BIGNUM *a = NULL;
BIGNUM *b = NULL;
BIGNUM *mul = BN_new( );
BN_dec2bn(&a, argv[1]);
BN_dec2bn(&b, argv[2]);
BN_mul( mul, a, b, ctx);
string mul_str = BN_bn2dec( mul );
cout << mul_str << endl;
BN_free( a );
BN_free( b );
BN_free( mul );
BN_CTX_free( ctx );
return 0;
}
此后,
$ g++ -v -o MUL MUL.cpp -lcrypto -lrt
$ ./MUL 1111111111111111111111 11111111111111111111111111111111111111
12345679012345679012344444444444444444320987654320987654321
或者您的号码:
$ ./MUL 130637788386308069046861449260260571291678458515671364436805375996643405376682659882150140370119739570729696093810308688223886144781635348688713392214619435345787110033188140509357535583193264801721383236152235906221860161085667905721519797609516199295279707992563172152784123713076584911245631751842633105652153513186684155079079372385923352208421842040532051768902602579344300869529063620569896872621227499787666438515766191438772844982077590564825560915004123788524793626088046688154064374425340131073611440941376503643793012676721171310302652283866154666880487476095144107907540698417260347310774677574064007810935083421437442654204085311165490420993090855747058348793757769523336364858305492927387281493416741250273266926840468154062676311322374882380011804120628601384191443885715160918938894478991212554338474935909274442208280226020332302710637502228813106477844481700372333640604211874260838332822176968781235304962300880267221110401606508880971834777831402249082184410637749400023282419270071233303228854128584088916313729295257781669730936517951304701393525757057288415991731506781288275420005462290126288405806701552761743270631625705587885293887371663631869096785158480771725887503591755610130637788386308069046861449260260571291678458515671364436805375996643405376682659882150140370119739570729696093810308688223886144781635348688713392214619435345787110033188140509357535583193264801721383236152235906221860161085667905721519797609516199295279707992563172152784123713076584911245631751842633105652153513186684155079079372385923352208421842040532051768902602579344300869529063620569896872621227499787666438515766191438772844982077590564825560915004123788524793626088046688154064374425340131073611440941376503643793012676721171310302652283866154666880487476095144107907540698417260347310774677574064007810935083421437442654204085311165490420993090855747058348793757769523336364858305492927387281493416741250273266926840468154062676311322374882380011804120628601384191443885715160918938894478991212554338474935909274442208280226020332302710637502228813106477844481700372333640604211874260838332822176968781235304962300880267221110401606508880971834777831402249082184410637749400023282419270071233303228854128584088916313729295257781669730936517951304701393525757057288415991731506781288275420005462290126288405806701552761743270631625705587885293887371663631869096785158480771725887503591755610 130637788386308069046861449260260571291678458515671364436805375996643405376682659882150140370119739570729696093810308688223886144781635348688713392214619435345787110033188140509357535583193264801721383236152235906221860161085667905721519797609516199295279707992563172152784123713076584911245631751842633105652153513186684155079079372385923352208421842040532051768902602579344300869529063620569896872621227499787666438515766191438772844982077590564825560915004123788524793626088046688154064374425340131073611440941376503643793012676721171310302652283866154666880487476095144107907540698417260347310774677574064007810935083421437442654204085311165490420993090855747058348793757769523336364858305492927387281493416741250273266926840468154062676311322374882380011804120628601384191443885715160918938894478991212554338474935909274442208280226020332302710637502228813106477844481700372333640604211874260838332822176968781235304962300880267221110401606508880971834777831402249082184410637749400023282419270071233303228854128584088916313729295257781669730936517951304701393525757057288415991731506781288275420005462290126288405806701552761743270631625705587885293887371663631869096785158480771725887503591755610
17066231754465807402900420358384027625063828147296398970430735667107038565643532131029262436685775911914313380489264979150809498798501933158462145225528180551769789575574797447397445413420626589337764710733729094394489883580640065014326441503312557193537990957436917477463646907709648408216434453480535184067598892956346170907569131377903528411111853111366291979626086698383298307345834392212231046634063413666384508324419179368057389725477538706904589815650381926976015993762890040156790405503832003268981872633663593094738685190702324170124859881504272985658187233430078072074850856278428071856485129710354193089376603399949840797557269752404324626163227377490362755801388382649764643331010423816641928437135475590362260226952505888042595117331291587671568162632704073970431619934337538342580157600657762301792637641467188915728074681445126309949503670453577866959321057221058159530832970764856624653513410124322745428166790635701352502052256269558858525352939994015481804509533547301113993717358659764948833130929069642122698202129401970681574382516490304799923426506769877124709868229514010141819989355368364493152148025681360589017051459966742937386231341355101280349206933137558553397562834428892415453233148641176771563712134361104022807550303488698075859517457925640610491054979460976360319484563783286684527208609132950696416209270231736324410954950684352328008061594161733388271145413633779170942608933174781023093090166766097051317310022316050630811133583173184115645711370920550992076973922926411319105318826733544096711620052335678566140497081147253812896893420327059981797167126306338464682511753397155370448528529202208913712194212784573851259886750498508574755936271159501806286495680771291521438702898980393172655721876464226059755372992679372981146919582948873581755274102131988783345665739059331911729901433053990191883389538118335419875393994271684373681810615128035637305671352255611195822986723919966346614504211249964663541945984204985492046339446890342152602121983526036026284992402505355803385348589918367728082706040916985152635360901742191941842971992737551826097028139759998758915104121256359451340107345440703495802418055755094797175689110387208266417084593991014867282339917152309333902180775075816625489223370772738533933334770778564779976389719378964794125379024410157550786106085604852610915830834787247811239349553909171864850989169291577662971436559192161855924800900992398387001394175369368663291775977076397743722156192299105428781790818602044847522848431713923633708651868973304037943629982141197617707337073274179185426770132582538432486796714335942857724787044441406231875204080386533209509526701082724875806709758857092820176146255706651998803661272142775642520442391227251506425870387373189142488674432150155028643969780961833270806721943761674451332734094107418048448339730770862124109349834151523986716674077669261444236368571532558762173381119345015880991848768022539566069235387298433970531174140055934895491488406387322959686152870801506904417823703916926860536028705138822353298033104149394326119785714010793712166616781321617880422232478270993974660928438969267385851248329604086387551705361922068424614692617313923883706742816371720982187645987693446127391744743054010747707122729452000008024595790675203131690448164324982521914771679392295264057374903374105401693996933614023173316709739350993750161786196236271822749116371726461907551046689900873564981257387360500771251705433693927287093968802056959550818280473764856549882949501840084257149510400015730796750717240359458767805153426658794187889587166234478619647814190297313764503421633608458361966472100