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


    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;
    }

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

  • 相关阅读:
    Windows 驱动加载程序代码
    coding push 上传文件
    MinGW 可以编译驱动的
    通过使用 NTLite 工具实现精简Windows系统
    一些常用的注入技巧
    Python 图片转字符图
    MySQL数据库及注入方法
    路由器被蹭网后,我有被黑的风险吗?
    markdown 实现代码折叠效果
    Windows 签名伪造工具的使用,Python,签名
  • 原文地址:https://www.cnblogs.com/fbwfbi/p/3356593.html
Copyright © 2020-2023  润新知