pascal,c,c++使用大于2^32整型的注意要点

大整数运算与取余技巧
本文介绍了在计算机编程中处理大整数运算及取余操作时需要注意的关键点,特别是当运算过程中值可能超出标准整型范围时的解决办法。通过Pascal、C和C++等语言的示例代码,详细解释了如何正确地进行大整数的乘法、加法和除法运算,并确保结果的准确性。

如果在你的电脑出现以下这种现象,则说明这篇文章适合你,否则不必理会。

 

适用于取余

比如求n!除以1000000007(被除数较大)的余数。

pascal:

pascal输出不需要说明格式,而若式子运算过程中的值都在2^64范围内,在整型范围内,则结果输出无错误,不需要高精度。

1 begin
2     writeln(100000*100000);
3     writeln(100000*10000 mod 100);
4 end.

 

c:

1.若式子运算过程中的值曾经在2^64范围内,大于2^32的范围,即使结果在2^32内,即使用long long,__int_64的数据保存,都要加上(long long) 或 (__int_64)。

Wrong:long long x;  x=1000000*1000000+2;

Yes:long long x;  x=(long long)1000000*1000000+2;

 

Wrong:printf("%ld\n",1000000*1000000/1000000);

Yes:printf("%ld\n",(long long)1000000*1000000/1000000);

2.若运算结果在2^64范围内,大于2^32的范围,则需要用到long long: %lld,__int_64: %i64d。

Wrong:printf("%lld\n",(long long)1000000*1000000+2);

Yes:printf("%ld\n",(long long)1000000*1000000+2);

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main()
 5 {
 6     long long x;
 7     x=(long long)1000000*1000000+2;
 8     printf("%lld\n",x);
 9     printf("%lld\n",(long long)1000000*1000000+2);
10 
11     printf("--------\n");
12 
13     x=1000000*1000000+2;
14     printf("%lld\n",x);
15     printf("%lld\n",1000000*1000000+2);
16     printf("%ld\n",(long long)1000000*1000000+2);
17 
18     printf("--------\n");
19 
20     printf("%ld\n",1000000*1000000/1000000);
21     printf("%ld\n",(long)1000000*1000000/1000000);
22     printf("%ld\n",(long long)1000000*1000000/1000000);
23     printf("%lld\n",1000000*1000000/1000000);
24     printf("%lld\n",(long long)1000000*1000000/1000000);
25 
26     return 0;
27 }

 

 

c++:

1.c++和pascal一样,输出不需要说明格式;而c输出需要说明格式,所以c++不用像c一样判断什么时候用%ld,或者%lld,%i64d。

2.若式子运算过程中的值曾经在2^64范围内,大于2^32的范围,即使结果在2^32内,即使用long long,__int_64的数据保存,都要加上(long long) 或 (__int_64)。这一点和c一样。

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     long long x;
 7     x=(long long)1000000*1000000+2;
 8     cout<<x<<endl;
 9     cout<<(long long)1000000*1000000+2<<endl;
10 
11     cout<<"--------"<<endl;
12 
13     x=1000000*1000000+2;
14     cout<<x<<endl;
15     cout<<1000000*1000000+2<<endl;
16 
17     cout<<"--------"<<endl;
18     cout<<1000000*1000000/1000000<<endl;
19     cout<<(long)1000000*1000000/1000000<<endl;
20     cout<<(long long)1000000*1000000/1000000<<endl;
21 
22     return 0;
23 }

转载于:https://www.cnblogs.com/cmyg/p/6648817.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值