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 }