笔记--64位整数

来源:互联网 发布:工作提醒软件 编辑:程序博客网 时间:2024/05/18 00:27

首先,还是先看一道题目吧:输入正整数n,统计它的正因子个数。n10^12。例如n=30时,输出8

简单的想,其实直接枚举不会超时。因为如果in的约数,那么n/i也是n的约数。除去i=n/i的情况,in/i恰好有一个不超过n的算术平方根。所以,从1枚举到即可。当然还有一个细节要十分注意,那就是n太大了,超出了int类型的表示范围。其实还有一种比int更大的类型,那就是long long ,它的表示范围是-2^63~2^63-1,比-10^1910^19略窄——我们平时使用的int类型的表示范围只是-2^31~2^31-1,只比-2×10^92×10^9略宽。

所以当常规的32位整数无法表示时就需要用64位整数来表示,输入输出long long可以借助printfscanf语句,但是对应的占位符却是和平台与编译器相关的:在Linux中,gcc很统一的用%lld;在Windows中,MinGWgccVC6.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;

}

注意看看二者的区别。

还是暂时想到这些,望对大家有所帮助,我还是初学者有些知识还是一知半解,望各位大神批评指正!!!不胜感激!!!

原创粉丝点击