平时各种小段代码的收集(二)
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; }
未完!待续········