平时各种小段代码的收集(二)

1.计算结果用链表存储的2000!的阶乘算法

#include "stdio.h" #include "stdlib.h" #include "string.h" typedef struct _numNode{ char num[100]; struct _numNode* prior; struct _numNode* next; }numNode,*numNodeptr; typedef struct { bool fist_output; numNodeptr next; }headNode; int main() { headNode Head={false,NULL}; numNodeptr p=(numNodeptr)malloc(sizeof(numNode)); memset(p->num,0,100); p->prior=NULL; p->next=NULL; Head.next=p; int temp=0; int c=0;//最开始作为进位申请内存标志 

    p->num[0]=1; for(int i=2;i<=2000;i++) //计算阶乘 

 { p=Head.next; for(;p->next;p=p->next); //从尾节点开始 

        do { if(p->prior) p=p->prior; for(int j=0;j<100;j++) { temp=(p->num[j])*i+temp; p->num[j]=temp%10; temp/=10; if(j==99&&temp&&!(p->prior)) c=1; } if(c) { numNodeptr q=(numNodeptr)malloc(sizeof(numNode)); memset(q->num,0,100); q->next=p; q->prior=NULL; p->prior=q; Head.next=q; p=q;//指向新插入的节点

                c=0; } /* if(p->prior){ p=p->prior; continue; } if(temp) continue; else break; }while(1);*/ }while((p->prior)||temp); } int count=0; for(p=Head.next;p;p=p->next) { if(!Head.fist_output){ for(c=99;!(p->num[c])&&c>=0;c--); count+=c+1; for(int i=c;i>=0;i--) printf("%d",p->num[i]); Head.fist_output=true; } else{ for(int i=99;i>=0;i--) printf("%d",p->num[i]); count+=100; } } printf("\ncount=%d\n",count); }

  

2.字符串转整数,溢出时用边界值代替

//copyright@njnu_mjn 2013   

#include <iostream>

using std::cout;

using std::cin;

using std::endl;



int my_isspace(int x)    

{    

    if(x==' '||x=='\t'||x=='\n'||x=='\f'||x=='\b'||x=='\r')    

        return 1;    

    else     

        return 0;    

}    

  

int my_isdigit(int x)    

{    

    if(x<='9'&&x>='0')             

        return 1;     

    else     

        return 0;    

} 



int StrToDecInt(const char* str)    

{    

    static const int MAX = (int)((unsigned)~0 >> 1);    

    static const int MIN = -(int)((unsigned)~0 >> 1) - 1;    

    static const int MAX_DIV = (int)((unsigned)~0 >> 1) / 10;    

    static const int MIN_DIV = (int)((((unsigned)~0 >> 1) + 1) / 10);    

    static const int MAX_R = (int)((unsigned)~0 >> 1) % 10;    

    static const int MIN_R = (int)((((unsigned)~0 >> 1) + 1) % 10);    

    int n = 0;    

    int sign = 1;    

    int c;    

    

    while (my_isspace(*str))    

        ++str;    

    if (*str == '+' || *str == '-')    

    {    

        if (*str == '-')    

            sign = -1;    

        ++str;    

    }    

    while (my_isdigit(*str))    

    {    

        c = *str - '0';    

        if (sign > 0 && (n > MAX_DIV || (n == MAX_DIV && c >= MAX_R)))    

        {    

            n = MAX;    

            break;    

        }    

        else if (sign < 0 && (n > MIN_DIV || (n == MIN_DIV && c >= MIN_R)))    

        {    

            n = MIN;    

            break;    

        }    

        n = n * 10 + c;    

        ++str;    

    }    

    return sign > 0 ? n : -n;    

}    





void main()

{

    char *teststr=new char[11];

    cout<<"请输入需要测试的字符串,数值溢出时将以边界值代替!"<<endl;

    cin>>teststr;

    cout<<"刚才输入的字符串为:"<<teststr<<endl;

    cout<<"输入字符串的长度为:"<<strlen(teststr)<<endl;

    cout<<"装换后的结果为:    "<<StrToDecInt(teststr)<<endl;

}

 

 

      未完!待续········

你可能感兴趣的:(代码)