首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 大数字阶乘问题!
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 18:17:38 楼主
    C/C++ code
    #include <iostream> #include <stdlib.h> using namespace std; int main() { int yu,max; cin>>yu; max=1; for(int i=1;i<=yu;i++) { max=max*i; } cout<<max; system("PAUSE"); return 0; }


    下列代码在输入大于30的数字以后应该会出现错误结果。标准C++规定了整形的最大数和最小数。那么当max超出这个值得时候怎么办?程序怎么处理比较好
    如果你用更大的数字类型如double,那么数字超过double的最大数是怎么办
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 18:18:181楼 得分:0
    数组存储
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 18:50:512楼 得分:0
    以前写的,lz可以参考一下:  我这里是用链表来存储数字的,每一个节点存储三位。
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    using namespace std;


    class List;
    class ListNode{
    friend class List;
    public:
    ListNode();                        //默认构造函数
    ListNode(const int& x);            //转型构造函数       
    private:
    int data;                          //数据域
    ListNode *link;                    //指针域
    };


    class List{
    public:
    List(){}
    List(const int& value){
    last=first=new ListNode(value);}//构造函数
    void  newNode(int item);            //建立一个新结点,结点中存储item
    ~List();                            //删除各个结点
    void CalculateValue(int N);        //计算
    void ShowValue();                  //输出结果
    void CalculateAdvanceOfEachNode(int i);
    //将链表的结点的每一位都乘以i,计算每一个结点
                                            //向下一个结点进位
    void ReverseListNode();
    private:
    ListNode *first,*last;
    int data;
    };


    ListNode::ListNode(const int& x):data(x),link(NULL){
    }

    void List::newNode(int item){
    last->link=new ListNode(item);
    last=last->link;
    }


    List::~List(){
    ListNode *q;
    while(first->link!=NULL){
    q=first->link;
    first->link=q->link;
    delete q;
    }
    last=first;
    delete first;
    }


    void List::CalculateAdvanceOfEachNode(int i){        //得到当前节点向高位节点的进位                
                     
    ListNode *p=first;                              //p指向第一个结点
    int advance=0;
    while(p!=NULL){
    p->data=p->data*i+advance;
    int t=p->data;
    p->data%=1000;
            advance=t/1000;
    p=p->link;
    }
    while(advance>0){
    newNode(advance%1000);
    advance/=1000;
    }
    }


    void List::CalculateValue(int N){ 
        first=new ListNode(1);
    last=first;                                   
    //将第一个结点初始化为1
    for(int i=1;i <=N;i++)
    CalculateAdvanceOfEachNode(i);
    }



    void List::ReverseListNode(){
    if(first==NULL)
    return;
    ListNode *pr=NULL;
    ListNode *p=first->link;
    while(p!=NULL){
    first->link=pr;
    pr=first;
    first=p;
    p=p->link;
    }
    first->link=pr;
    }


    void List::ShowValue(){
    ListNode *p=first;
    while(p!=NULL){
    if(p->data>=100&&p->data <1000)
    cout < <p->data < <' ';
    if(p->data <10&&p==first)                         
    //当小于10时且是最高位,直接输出,否则要补两个零
    cout < <p->data < <' ';
    if(p->data <10&&p!=first)
    cout < <"00" < <p->data < <' ';
    if(p->data>=10&&p->data <100&&p!=first)
    cout < <"0" < <p->data < <' ';
    if(p->data>=10&&p->data <100&&p==first)
    cout < <p->data < <' ';
    p=p->link;
    }

    }
    int main(){
    List ll;
    int N=0;
    while(1){                                    //重复输入并计算
    system("cls");
        cout < <"此程序可以计算大数阶乘,请您输入N:" < <endl;
        cout < <"请您输入N的值:" < <endl;
        cin>>N;
    while(N <=0){
    cout < <"您的输入不合法,请您检查输入并重新输入N:" < <endl;
    cin.clear();
    cin.sync();
    cin>>N;
    }
    time_t beg = clock();
        ll.CalculateValue(N);
    time_t end = clock();
    double time = end - beg;
    ll.ReverseListNode();
        ll.ShowValue();
                              //清屏之前先输出结果
    cout < <"用时" < <time / 1000.0 < <'s' < <endl;
    system("pause");
    }
    return 0;
    }


    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved