返回列表 回复 发帖

请问是否有比long long int更长的整型类型?

今天编辑计算斐波那契数列的程序,用long int可以计算前46个数,用long long int可以计算前92个数,但是我想计算前100个数,请问是否有比long long int更长的整型类型?
没有了。
对于超长的数字,你只能考虑把一个数字分为两个数字进行处理。
例如,将一个数字a拆分为b和c。a=b*100000000000+c

这样就可以了。
如何使长整型数在取模后保持长度不变,例如一个19位数(次高位为零)再取10的18次幂的模后,能保证数字长不变,不足长度最高位补零.
我写了一个计算斐波那契数列的程序,按照你的方法,结果很悲剧.
#include <stdafx.h>
#include <iostream>
#include <limits.h>
#include <malloc.h>
using namespace std;
int main(void)
{
        int n;
        cout<<"请输入Fabonacci数列所求数个数:";
        cin>>n;
        long long int *a;
        a=(long long int*)malloc(sizeof(long long int));
        a=new long long int[n];
        int i=2;
        a[1]=1;
        a[2]=1;
        a[3]=2;
        int m;
        int odd=2;
        int even=0;
        if (n>2)
        {
        cout<<"第1个数是1是奇数"<<endl;
        cout<<"第2个数是1是奇数"<<endl;
                do
                {
                        i++;
                        a[i]=a[(i-1)]+a[(i-2)];
                        cout<<"第"<<i<<"个数是"<<a[i];
                        m=a[i]%2;
                        switch(m)
                        {
                        case 0:
                                cout<<"是偶数"<<endl;
                                even++;
                        if (a[i]>1000000000000000000)
                        {
                                goto BIGNUM;
                        }
                                continue;
                        case 1:
                                cout<<"是奇数"<<endl;
                                odd++;
                        if (a[i]>1000000000000000000)
                        {
                                goto BIGNUM;
                        }
                                continue;
                         }
                }while(i<n);
        goto END;
        }
        if (n==1)
        {
                cout<<"第1个数是1"<<endl;
                cout<<"前1个数共有0个偶数"<<endl;
                cout<<"前1个数共有1个奇数"<<endl;
                goto END;
        }
        if (n==2)
        {
            cout<<"第1个数是1"<<endl;
                cout<<"第2个数是1"<<endl;
                cout<<"前2个数共有0个偶数"<<endl;
                cout<<"前2个数共有2个奇数"<<endl;
                goto END;
        }
        if (n<=0)
        {
                cout<<"错误!"<<endl;
                goto END;
        }
BIGNUM:long long int a1;
           long long int a2;
           long long int a3;
           long long int b1;
           long long int b2;
           long long int b3;
           long long int c1;
           long long int c2;
           long long int c3;
           a1=0;
           b1=a[(i-1)];
           a2=1;
           b2=a[i]-1000000000000000000;
           i++;
           for (i=i;i<=n;i++)
           {
                    b3=(b1+b2)%1000000000000000000;
                        a3=(a1+a2)+(b1+b2)/1000000000000000000;
                        cout<<"第"<<i<<"个数是"<<a3<<b3;
                        m=b3%2;
                        a1=a2;
                        b1=b2;
                        a2=a3;
                        b2=b3;
                        switch(m)
                        {
                        case 0:
                                cout<<"是偶数"<<endl;
                                even++;
                        if (a3>1000000000000000000)
                        {
                                goto LBIGNUM;
                        }
                                continue;
                        case 1:
                                cout<<"是奇数"<<endl;
                                odd++;
                        if (a3>1000000000000000000)
                        {
                                goto LBIGNUM;
                        }
                                continue;
                        }
           }
           goto END;
LBIGNUM:b1=a1;
            b2=a3-1000000000000000000;
                c1=b1;
                c2=b3;
                a1=0;
                a2=1;
                i++;
                for (;i<=n;i++)
                {
                        c3=(c1+c2)%1000000000000000000;
                        b3=((b1+b2)+(c1+c2)/1000000000000000000)%1000000000000000000;
                        a3=((a1+a2)+(b1+b2)/1000000000000000000)%10000000000000000000;
                        cout<<"第"<<i<<"个数是"<<a3<<b3<<c3;
                        m=c3%2;
                        a1=a2;
                        b1=b2;
                        c1=c2;
                        a2=a3;
                        b2=b3;
                        c2=c3;
                        switch(m)
                        {
                        case 0:
                                cout<<"是偶数"<<endl;
                                even++;
                                continue;
                        case 1:
                                cout<<"是奇数"<<endl;
                                odd++;
                        }
                }
END:
cout<<"在Fabonacci数列前"<<n<<"个数共有"<<even<<"个偶数"<<endl;
cout<<"在Fabonacci数列前"<<n<<"个数共有"<<odd<<"个奇数"<<endl;
cout<<"请输入任意字符按回车结束"<<endl;
cin>>n;
}
有的数比前一个数更小,结果研究发现是取模运算时出了问题.
实际你谈到的就是算法中的大数问题。我从网上找到一个类似代码,你可以参考一下。http://bbs.bccn.net/thread-308560-1-1.html
虽然看的不是很明白,但还是谢谢你
5# 范文捷

这个东西确实比较麻烦。我记得这是计算机专业本科和研究生必做题目。说明这个是有一定难度的。
我也看不懂0.0 没有老师就是不行啊
返回列表