大数
1. 基于OpenSSL的大数库计算2的1232次方(5‘)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/bn.h> int main() { BN_CTX *r; BIGNUM *a; BIGNUM *b; BIGNUM *c; char *x; char s[]="2"; char t[]="1232"; r = BN_CTX_new(); a = BN_new(); b = BN_new(); c = BN_new(); BN_dec2bn(&a, s); BN_dec2bn(&b, t); BN_exp(c,a,b,r);//计算2^1232次方 x = BN_bn2dec(c);//把计算结果(大数)转化成10进制数 puts(x);//打印出x BN_free(a); BN_free(b); BN_free(c); BN_CTX_free(r); free(x); return 0; }
结果截图:
2. 基于OpenSSL的大数库计算你以及前面5位同学和后面5位同学的8位学号的乘积(5‘)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/bn.h> int main() { BN_CTX *r[11]; BIGNUM *bn[12]; int i; const char s[11][9]={"20191227","20191228","20191229","20191230","20191231","20191232","20191233","20191234","20191235","20191236","20191237"}; char* out; char t[2]="1"; for(i=0;i<11;i++){ bn[i]=BN_new(); BN_dec2bn(&bn[i],s[i]); r[i] = BN_CTX_new(); } bn[11]=BN_new(); BN_dec2bn(&bn[11],t); for(i=0;i<11;i++){ BN_mul(bn[11],bn[11],bn[i],r[i]); //计算11个同学学号的乘积 } out= BN_bn2hex(bn[11]); //将大数转化转化成16进制的字符串 puts(out);//打印出字符串 for(i=0;i<11;i++){ BN_free(bn[i]); BN_CTX_free(r[i]); } BN_free(bn[i]); free(out); return 0; }
结果截图:
3. 用bc命令验证计算的正确性(5’)
验证2的1232次方:
验证前面5位同学和后面5位同学的8位学号的乘积: