printf函数分别在window和linux打印long long(_int64)

本文介绍了Microsoft Visual C++ 6.0中处理longlong类型的方法,由于该版本不直接支持longlong,因此使用_int64替代,并提供了在Windows和Linux环境下使用printf函数的不同格式化字符串来正确输出longlong类型的数值。此外,还提供了一个递归函数用于打印longlong类型的整数。

首先 Microsoft Visual C++ 6.0 不支持 long long ,支持_int64

printf 输出 long long

在windows 环境下 %I64d

在linux 环境下 %lld

另外打印long long型的函数如下:

void print_bigint(long long n)
{
if (n>=10)
print_bigint(n/10);
printf("%d",int(n%10));
}

#include <stdio.h> #include <stdlib.h> // 计算模幂运算 a^b % mod long long mod_pow(long long a, long long b, long long mod) { long long result = 1; a = a % mod; while (b > 0) { if (b & 1) result = (result * a) % mod; b = b >> 1; a = (a * a) % mod; } return result; } // 扩展欧几里得算法,用于计算模逆元 long long extended_gcd(long long a, long long b, long long *x, long long *y) { if (b == 0) { *x = 1; *y = 0; return a; } long long x1, y1; long long gcd = extended_gcd(b, a % b, &x1, &y1); *x = y1; *y = x1 - (a / b) * y1; return gcd; } // 计算模逆元 long long mod_inverse(long long a, long long mod) { long long x, y; long long gcd = extended_gcd(a, mod, &x, &y); if (gcd != 1) { printf("Modular inverse does not exist!\n"); return -1; } return (x % mod + mod) % mod; } // ElGamal签名算法 void elgamal_sign(long long p, long long a, long long x, long long h_m, long long k, long long *r, long long *s) { *r = mod_pow(a, k, p); long long k_inv = mod_inverse(k, p - 1); *s = (k_inv * (h_m - x * (*r))) % (p - 1); if (*s < 0) *s += p - 1; } // ElGamal验证算法 int elgamal_verify(long long p, long long a, long long y, long long h_m, long long r, long long s) { long long left = mod_pow(y, r, p) * mod_pow(r, s, p) % p; long long right = mod_pow(a, h_m, p); return left == right; } int main() { long long p, a, x, h_m, k; long long r, s; // 从键盘输入p、a、用户私钥x、消息m的散列码H(m)、签名的随机数k printf("Enter prime number p: "); scanf("%lld", &p); printf("Enter primitive root a: "); scanf("%lld", &a); printf("Enter private key x: "); scanf("%lld", &x); printf("Enter hash of message H(m): "); scanf("%lld", &h_m); printf("Enter random number k: "); scanf("%lld", &k); // 生成公钥y long long y = mod_pow(a, x, p); // 进行签名 elgamal_sign(p, a, x, h_m, k, &r, &s); printf("Signature (r, s): (%lld, %lld)\n", r, s); // 进行验证 int valid = elgamal_verify(p, a, y, h_m, r, s); if (valid) printf("Signature is valid.\n"); else printf("Signature is invalid.\n"); return 0; } 输出结果大一点
最新发布
11-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值