处理乘法取模爆long long 的方法

#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <ctime> 
#include <cstdlib> 
#include <algorithm> 
#include <stack> 
#include <cmath> 
#include <vector> 
#define eps 1e-6 
#define INF 1000000007 
#define PI acos(-1.0) 
using namespace std; 
long long mod = 10000000000LL; 
long long multi(long long a, long long b, long long c) 
{ 
long long ret = 0; 
while(b) 
{ 
if(b & 1) 
{ 
ret += a; 
if(ret >= c) 
ret -= c; 
} 
a += a; 
if(a >= c) a -= c; 
b >>= 1; 
} 
return ret; 
} 
long long fastmod(long long a, long long b, long long c)//a^b mod c 
{ 
long long ret = 1; 
a %= c; 
for (; b; b >>= 1, a = multi(a, a, c)) 
if (b & 1) 
ret = multi(ret, a, c); 
return ret; 
} 

int main() 
{ 
long long sum = 0; 
for(int i = 1; i <= 1000; i++) 
sum = (sum + fastmod(i, i, mod)) % mod; 
cout << sum << endl; 
return 0; 
} 


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果要在 C 语言中存储数据超过 long long int 类型所能表示的范围,可以使用高精度数学库,或者使用其他语言来实现,然后再用 C 语言调用。 例如,可以使用 GMP(GNU Multiple Precision Arithmetic Library)库来实现高精度数学运算,包括加法、减法、乘法、除法和取模等运算。 使用 GMP 库时,需要在程序中包含头文件<gmp.h>,并使用 mpz_t 类型来表示高精度整数。 使用方法示例: ``` #include <stdio.h> #include <gmp.h> int main(void) { mpz_t a, b, c; mpz_init(a); mpz_init(b); mpz_init(c); // 读入高精度数 a 和 b mpz_inp_str(a, stdin, 10); mpz_inp_str(b, stdin, 10); // 计算 a+b 的值,并将结果存储在 c 中 mpz_add(c, a, b); // 输出 c 的值 mpz_out_str(stdout, 10, c); putchar('\n'); mpz_clear(a); mpz_clear(b); mpz_clear(c); return 0; } ``` 在编译时,需要添加 -lgmp 选项,例如: ``` gcc example.c -o example -lgmp ``` 此外,还可以使用 Python、Java 等语言中的高精度数学库,并在 C 语言中使用相应的外部函数调用接口。 希望这些信息对你有帮助。 ### 回答2: 在C语言中,使用long long int类型可以存储相对较大的整数数据,而当数据超出其表示范围时,可以采取以下策略来存储: 1. 使用大整数库:可以使用第三方库,如GMP(GNU Multiple Precision Arithmetic Library)来处理长整数。该库提供了高精度的整数运算函数,允许存储和操作任意大小的整数。 2. 自定义数据结构:可以使用自定义的数据结构来存储长整数。例如,可以使用数组来表示一个长整数,每个数组元素存储一个数字位,然后通过自定义的函数来实现相应的运算,如加法、减法、乘法和除法。 3. 分段存储:对于较大的整数,可以将它分解为多个部分进行存储。例如,可以使用数组或链表来存储整数的每一部分,然后通过对每个部分进行运算来获取最终结果。 4. 使用字符串存储:将长整数表示为一个字符串,可以使用字符数组来存储它。然后,通过自定义的字符串操作函数来实现各种运算。 需要注意的是,使用这些方法进行高精度计算会带来性能上的损失,因为它们会占用更多的内存和运算时间。因此,在选择适当的存储方式时,需要权衡计算性能和所需内存空间之间的平衡。 ### 回答3: 在C语言中,如果long long int的数据范围超出了可存储的范围,可以采取以下方法存储这些数据。 1. 使用字符串存储:可以将超出范围的long long int数据转换为字符串来存储。可以使用sprintf函数将long long int类型的数据格式化为字符串,并使用字符数组来存储。 示例代码: ```c #include <stdio.h> #include <stdlib.h> int main() { long long int bigNum = 123456789123456789; char str[50]; // 定义一个足够大的字符数组来存储转换后的字符串 sprintf(str, "%lld", bigNum); // 将bigNum转换为字符串并存储在str中 printf("Stored number: %s\n", str); return 0; } ``` 2. 使用数组存储:如果数据超出long long int的范围,可以考虑将数据拆分为多个部分进行存储,使用一个数组来存储这些部分。每个数组元素存储一个范围内的值。 示例代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_ARRAY_SIZE 10 int main() { long long int bigNum = 123456789123456789; int array[MAX_ARRAY_SIZE]; // 定义一个足够大的整型数组来存储数据 // 将bigNum拆分为多个部分存储在数组中 for (int i = 0; i < MAX_ARRAY_SIZE; i++) { array[i] = bigNum % 10; bigNum /= 10; } // 打印数组元素 printf("Stored number: "); for (int i = MAX_ARRAY_SIZE - 1; i >= 0; i--) { printf("%d", array[i]); } printf("\n"); return 0; } ``` 这些方法可以帮助我们存储超出long long int范围的数据。注意,当需要使用存储的数据时,需要根据具体情况进行数据转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值