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

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

 

适用于取余

比如求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 }

posted @ 2017-03-30 21:59  congmingyige  阅读(485)  评论(0编辑  收藏  举报