首先,还是先看一道题目吧:输入正整数n,统计它的正因子个数。n≤10^12。例如n=30时,输出8。
简单的想,其实直接枚举不会超时。因为如果i为n的约数,那么n/i也是n的约数。除去i=n/i的情况,i和n/i恰好有一个不超过n的算术平方根。所以,从1枚举到即可。当然还有一个细节要十分注意,那就是n太大了,超出了int类型的表示范围。其实还有一种比int更大的类型,那就是long long ,它的表示范围是-2^63~2^63-1,比-10^19~10^19略窄——我们平时使用的int类型的表示范围只是-2^31~2^31-1,只比-2×10^9~2×10^9略宽。
所以当常规的32位整数无法表示时就需要用64位整数来表示,输入输出long long可以借助printf和scanf语句,但是对应的占位符却是和平台与编译器相关的:在Linux中,gcc很统一的用%lld;在Windows中,MinGW的gcc和VC6.0都需要用%I64d;但VS2008却是用%lld。据说还有一种方法是适用C++的输入输出流(尚未研究)。
64位整数的运算与32位整数基本相同,都支持四则运算与位运算等。当进行64位与32位的混合运算时,32位整数会被隐式转换成64位整数。
如我们学校OJ上一道题a+b+c,当然可以直接用int,在此用long long 写一下,作为一个小例子,说明一下它的用法。
提交的时候
#include<stdio.h>
int main()
{
long long int a,b,c;
while(scanf("%lld%lld%lld",&a,&b,&c)!=EOF)
{
printf("%lld\n",a+b+c);
}
return 0;
}
在vc++6.0中要写为:
#include<stdio.h>
int main()
{
__int64 a,b,c;
while(scanf("%I64d%I64d%I64d",&a,&b,&c)!=EOF)
{
printf("%I64d\n",a+b+c);
}
return 0;
}
注意看看二者的区别。
还是暂时想到这些,望对大家有所帮助,我还是初学者有些知识还是一知半解,望各位大神批评指正!!!不胜感激!!!