文档库 最新最全的文档下载
当前位置:文档库 › 计算机考研核心代码

计算机考研核心代码

1.10进制转换
#include
#include
#define stack_size 100
#define stack_extra_size 10
typedef struct
{
int *base;
int *top;
int stacksize;
}stack,*pstack;
void initstack(stack *s)
{
s->base=(int *)malloc(stack_size*sizeof(int));
s->top=s->base;
s->stacksize=stack_size;
}
void push(stack *s,int e)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(int *)realloc(s->base,(stack_size+stack_extra_size)*sizeof(int));
if(!s->base )exit(-1);
s->top=s->base+s->stacksize;
s->stacksize+=stack_extra_size;
}
*s->top=e;s->top++;
}
int pop(stack *s,int *e)
{
if(s->top==s->base ) return 0;
else
{
*e=*(--s->top);return 1;
}
}
int stackempty(stack s)
{
if(s.top==s.base )return 1;
else return 0;
}
void datechange(int a,int N)
{
stack s;
int e;
initstack(&s);
while(a)
{
push(&s,a%N);
a/=N;
}
while(!stackempty(s))
{
pop(&s,&e);
printf("%d",e);
}printf("\n");
}
void sixteenchange(int n)
{
int e;
stack s;initstack(&s);
while(n)
{
push(&s,n%16);
n/=16;
}
while(!stackempty(s))
{
pop(&s,&e);
switch(e)
{
case 10:printf("A");break;
case 11:printf("B");break;
case 12:printf("C");break;
case 13:printf("D");break;
case 14:printf("E");break;
case 15:printf("F");break;
default :printf("%d",e);break;
}
}printf("\n");
}
void main()
{
int n,N;char k=' ';

while(k!='#')
{
printf("请输入您想要从10进制转换后的进制数:(一般有几种,大于等于10的只有16进制)");
scanf("%d",&N);
printf("请输入一些10进制数,然后转换为%d进制\n",N);
printf("请输入一个数:");
scanf("%d",&n);
printf("转化为%d进制后为:",N);
if(N==16) sixteenchange(n);
else datechange(n,N);
printf("还想继续吗? \n继续请按其他键,结束请按#键:");
getchar();
scanf("%c",&k);
}
}

//编程,按递增次序生成集合M的最小的100个数并输出之。
#include
int paixu(long *num , int i)
{ int j; long temp;
for(j=0;j{ if(num[i-1]{ temp=num[i-1];
num[i-1]=num[j];
num[j]=temp;
}
else if(num[i-1]==num[j])
{
i--;return 0;
}
} return 1;
}
void main()
{ long num[101]; int i=1,pos=0; num[0]=1;
while(1)
{
num[i++]=num[pos]*2+1;
if(!paixu(num,i))
i--;
if(i==100)
break;
num[i++]=num[pos]*3+1;
if(!paixu(num,i))
i--;
if(i==100)
break;
pos++;
}
for(i=0;i<100;i++)
printf("%-4ld",num[i]);
}


//方阵填数
#include
int main()
{ int i,j,k,a[101][101],n,m,p,q;
while(scanf("%d",&n)!=EOF)
{
m=n;k=1;q=1;p=1; //m把最初的n值记录下来,以后要用,而n则会不断变化
while(k<=m*m) //循条件
{
if(p==1) //把整个填充过程分为两个阶段1

:向下、向左填2;向上、向右填,之后再回到最初的形式
{
i=q++;j=n;a[i][j]=k++; //先将第一个数填上,q用来标记填完一圈后最左面的那一列是第几列,为以后判断用
if(j==n)//向下填
{
while(i!=n)
{ i++; a[i][j]=k++;
}
}
if(i==n)//再向左填
{
while(j!=(q-1))//每一圈的最左边的一列一定是的(q-1)列
{ j--; a[i][j]=k++;
}
}
if(i==n&&j==(q-1))//每一圈的第一阶段完成后n减1,p=2,转换到第二阶段填充
{ n--; p=2;
}
}
else
{
j=q-1;i=n;a[i][j]=k++;//第二阶段填充也是先填充第一个
if(j==(q-1))//向上填
{
while(i!=(q-1))
{ i--; a[i][j]=k++;
}
}
if(i==(q-1))//向右填
{
while(j!=n)
{ j++; a[i][j]=k++;
}
}
if(i==(q-1)&&j==n)//第二阶段完成,转换成第一阶段填充
p=1;
}
}
for(i=1;i<=m;i++)//输出矩阵
{
for(j=1;j<=m;j++)
printf("%-4d ",a[i][j]);
printf("\n");
}
}
return 0;
}

/建立一颗二叉树以二叉链表存储,输出要求的树状编号
#include
#include
#include
//#if 1
typedef struct Node
{
int num;
char data;
struct Node* LChild;
struct Node* RChild;

}BiTNode,*BiTree;

void CreateBiTree(BiTree *bt)
{
char ch;
ch=getchar();
if(ch=='.') *bt=NULL;
else
{
*bt=(BiTree)malloc(sizeof(BiTNode));
(*bt)->data=ch;
CreateBiTree(&((*bt)->LChild));
CreateBiTree(&((*bt)->RChild));
}
}

void PostOrder(BiTree root)
{
if(root!=NULL)
{
PostOrder(root->LChild);
PostOrder(root->RChild);
scanf("%d",&(root->num));
}
}
int PrintTree(BiTree bt,int nLayer,int flag)
{
int i;
if(bt == NULL) return 1;
PrintTree( bt->RChild, nLayer+1,flag);
for(i=0;iprintf(" ");
if(flag==1)
printf("%c\n",bt->data);
else
printf("%d\n",bt->num);
PrintTree( bt->LChild, nLayer+1,flag);
return 0;
}
void main()
{
void CreateBiTree(BiTree *bt);
int PrintTree(BiTree bt,int nLayer,int flag);
void PostOrder(BiTree root);
BiTree bt=NULL;
printf("input the data of the Node:\n");
CreateBiTree(&bt);
PrintTree( bt,1,1);
printf("input the num of the Node:from 1 to n(n is the number of the node):\n");
PostOrder(bt);
PrintTree( bt,1,0);
}*/
//#endif

//排序
#include
void main(){
int n,i,j,min,t;
int a[100];
printf("请输入要排数的个数:\n");
scanf("%d",&n);
printf("请输入要排的数:\n");
for(i=0;iscanf("%d",&a[i]);
/*冒泡*/
/* for(i=0;ifor(j=0;jif(a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}*/
/

*选择*/
for(i=0;imin=i;
for(j=i+1;jif(a[min]>a[j])
min=j;
t=a[i];
a[i]=a[min];
a[min]=t;
}

for(i=0;iprintf("%d ",a[i]);
printf("\n");


}

///////最大字符平台
#include
#include
#define Maxsize 20
#define n 100
typedef struct Node
{
int element[Maxsize];
int front;
int rear;
}Queue;
int EnterQueue(Queue *Q,int x)
{
if((Q->rear+1)%Maxsize == Q->front)
{
printf("队列已满!\n");
return 0;
}
Q->element[Q->rear] = x;
Q->rear = (Q->rear+1)%Maxsize;
return 1;
}
int DeleQueue(Queue *Q,int *x)
{
if(Q->front == Q->rear)
{
printf("队列为空!\n");
return 0;
}
*x = Q->element[Q->front];
Q->front = (Q->front+1)%Maxsize;
return 1;
}
int Donull(Queue *Q)
{
while(Q->front != Q->rear)
{
Q->element[Q->front] = 0;
Q->front = (Q->front+1)%Maxsize;
}
Q->front = Q->rear = 0;
if(Q->front == Q->rear)
{
return 1;
}
else
{
return 0;
}
}
int main(void)
{
char str[n];
int i=0,j=1,k=1,ch,p=1,flag=1;
Queue *Q;

Q = (Queue *)malloc(sizeof(Queue));
Q->front = Q->rear = 0;

printf("请输入字符串:");
gets(str);

while('\0' != *(str+i))
{ while(*(str+i+1) == *(str+i))
{
if(flag)
{
p = i;
flag = 0;
}
i++;
j++;
}
if(flag)
{
p = i;
}
if(j >= k)
{
if(j > k)
{
Donull(Q);
k = j;
}
if(EnterQueue(Q ,j) == 0)break;
if(EnterQueue(Q,p+1) == 0)break;
if(EnterQueue(Q,*(str+i)) == 0)break;
}
j=1;
i++;
flag = 1;
} while(Q->front < Q->rear)
{
DeleQueue(Q,&j);
DeleQueue(Q,&k);
DeleQueue(Q,&ch);
printf("%-10d",k);
for(i = 0; i < j; i++)
{
printf("%c",ch);
}
printf("\n");
}
printf("\n");
system("pause");
}
//////////完数分解
#include
main()
{
int n,i;
printf("\nplease input a number:\n");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
{
while(n!=i)
{
if(n%i==0)
{
printf("%d*",i);
n=n/i;
}
else
break;
}
}
printf("%d",n);
}
/////////二叉排序树
#include
#include
#define Maxsize 20
#define n 100
typedef struct node
{
int key;
struct node *lchild,*rchild;
}Bstnode;
Bstnode *InsertBST(Bstnode *t,int x) /*插入关键值为x的元素*/
{
Bstnode *s,*p,*f; /**s为待插结点,*p为逐层查找结点,*f为待插结点的父结点*/
p=t;
while(p!=NULL)
{
f=p;
if(

x==p->key) /*若已有关键值为x的元素,无需插入*/
return t;
if(xkey)
{
p=p->lchild;
}
else
{
p=p->rchild;
}
}
s=(Bstnode *)malloc(sizeof(Bstnode));
s->key=x;
s->lchild=NULL;
s->rchild=NULL;
if(t==NULL) /*原树为空,新结点作为二叉排序树的根*/
return s;
if(xkey)
f->lchild=s; /*新结点作为*f左孩子*/
else
f->rchild=s; /*新结点作为*f右孩子*/
return t;

}

/*定义中序遍历函数(递归法)*/
void Inorder(Bstnode *t)
{
if(t!=NULL) /*若二叉树不空*/
{
Inorder(t->rchild); /*遍历左孩子*/
printf("%4d",t->key);
Inorder(t->lchild) ; /*遍历右孩子*/
}
}
Bstnode *CreateBST()
{
Bstnode *t;
int s;
t=NULL; /*设置二叉排序树的初态为空*/
scanf("%d",&s);
while(s!=-1) /*输到结束符为止*/
{
t=InsertBST(t,s);
scanf("%d",&s);
}
return t;
}
void main(){
Bstnode *t;
t=CreateBST();
Inorder(t);

}
//////杨辉三角形
#include
void main(){
int i,j;
int a[10][10];
for(i=0;i<10;i++){
a[i][0]=1;
a[i][i]=1;
}
for(i=2;i<10;i++){
for(j=1;ja[i][j]=a[i-1][j-1]+a[i-1][j];
}
for(i=0;i<10;i++){
for(j=0;j<=i;j++)
printf("%-5d",a[i][j]);
printf("\n");
}


}
////////查找
#include
void main(){
int i,n,m;int low,high,mid;
int a[200];
printf("数组的个数:\n");
scanf("%d",&n);
printf("请给数组赋值:\n");
for(i=0;iscanf("%d",&a[i]);
printf("请输入查找的数:\n");
scanf("%d",&m);
/*直接查找*/
/*for(i=0;iif(a[i]==m)
break;
if(i!=n)
printf("%d\n",i);
else
printf("-1\n");*/
/*折半查找*/
low=0;high=n-1;
while(low<=high){
mid = (low+high)/2;
if(a[mid]==m)
break;
else if(a[mid]low = mid+1;
else
high = mid -1;
}
if(low<=high)
printf("%d\n",mid);
else
printf("-1\n");

}


【程序11】
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月
后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
2.程序源代码:
main()
{
long f1,f2;
int i;
f1=f2=1;
for(i=1;i<=20;i++)
{ printf("%12ld %12ld",f1,f2);
if(i%2==0) printf("\n");/*控制输出,每行四个*/
f1=f1+f2; /*前两个月加起来赋值给第三个月*/
f2=f1+f2; /*前两个月加起来赋值给第三个月*/
}
}
-----------------------------------------------------------------------------
【程序12】
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分

别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。
2.程序源代码:
#include "math.h"
main()
{
int m,i,k,h=0,leap=1;
printf("\n");
for(m=101;m<=200;m++)
{ k=sqrt(m+1);
for(i=2;i<=k;i++)
if(m%i==0)
{leap=0;break;}
if(leap) {printf("%-4d",m);h++;
if(h%10==0)
printf("\n");
}
leap=1;
}
printf("\nThe total is %d",h);
}
-----------------------------------------------------------------------------
【程序13】
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数
本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
2.程序源代码:
main()
{
int i,j,k,n;
printf("'water flower'number is:");
for(n=100;n<1000;n++)
{
i=n/100;/*分解出百位*/
j=n/10%10;/*分解出十位*/
k=n%10;/*分解出个位*/
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
{
printf("%-5d",n);
}
}
printf("\n");
}

printf("%d",n);}

-----------------------------------------------------------------------------
【程序16】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
2.程序源代码:
main()
{
int a,b,num1,num2,temp;
printf("please input two numbers:\n");
scanf("%d,%d",&num1,&num2);
if(num1 { temp=num1;
num1=num2; 
num2=temp;
}
a=num1;b=num2;
while(b!=0)/*利用辗除法,直到b为0为止*/
{
temp=a%b;
a=b;
b=temp;
}
printf("gongyueshu:%d\n",a);
printf("gongbeishu:%d\n",num1*num2/a);
}


-------------------------------------------------------------------
【程序19】
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
找出1000以内的所有完数。
1. 程序分析:请参照程序<--上页程序14.
2.程序源代码:
main()
{
static int k[10];
int i,j,n,s;
for(j=2;j<1000;j++)
{
n=-1;
s=j;
for(i=1;i {
if((j%i)==0)
{ n++;
s=s-i;
k[n]=i;
}
}
if(s==0)
{
printf("%d is a wanshu",j);
for(i=0;i printf("%d,",k[i]);
printf("%d\n",k[n]);
}
}
}
-----------------------------------------------------------------------------
【程序23】
题目:打印出如下图案(菱形)
*
***
******
********
******
***
*
1.程序分析:先把图形分成两部分来看

待,前四行一个规律,后三行一个规律,利用双重
for循环,第一层控制行,第二层控制列。
2.程序源代码:
main()
{
int i,j,k;
for(i=0;i<=3;i++)
{
for(j=0;j<=2-i;j++)
printf(" ");
for(k=0;k<=2*i;k++)
printf("*");
printf("\n");
}
for(i=0;i<=2;i++)
{
for(j=0;j<=i;j++)
printf(" ");
for(k=0;k<=4-2*i;k++)
printf("*");
printf("\n");
}
}

【程序30】
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
1.程序分析:同29例
2.程序源代码:
main( )
{
long ge,shi,qian,wan,x;
scanf("%ld",&x);
wan=x/10000;
qian=x%10000/1000;
shi=x%100/10;
ge=x%10;
if (ge==wan&&shi==qian)/*个位等于万位并且十位等于千位*/
printf("this number is a huiwen\n");
else
printf("this number is not a huiwen\n");
}

-----------------------------------------------------------------------------
【程序67】
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
1.程序分析:谭浩强的书中答案有问题。
2.程序源代码:
main()
{
int number[10];
input(number);
max_min(number);
output(number);
}
input(number)
int number[10];
{int i;
for(i=0;i<9;i++)
scanf("%d,",&number[i]);
scanf("%d",&number[9]);
}
max_min(array)
int array[10];
{int *max,*min,k,l;
int *p,*arr_end;
arr_end=array+10;
max=min=array;
for(p=array+1;p if(*p>*max) max=p;
else if(*p<*min) min=p;
k=*max;
l=*min;
*p=array[0];array[0]=l;l=*p;
*p=array[9];array[9]=k;k=*p;
return;
}
output(array)
int array[10];
{ int *p;
for(p=array;p printf("%d,",*p);
printf("%d\n",array[9]);
}
-----------------------------------------------------------------------------
【程序68】
题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
1.程序分析:
2.程序源代码:
main()
{
int number[20],n,m,i;
printf("the total numbers is:");
scanf("%d",&n);
printf("back m:");
scanf("%d",&m);
for(i=0;i scanf("%d,",&number[i]);
scanf("%d",&number[n-1]);
move(number,n,m);
for(i=0;i printf("%d,",number[i]);
printf("%d",number[n-1]);
}
move(array,n,m)
int n,m,array[20];
{
int *p,array_end;
array_end=*(array+n-1);
for(p=array+n-1;p>array;p--)
*p=*(p-1);
*array=array_end;
m--;
if(m>0) move(array,n,m);
}
-----------------------------------------------------------------------------
//统计整数
#include
void main()
{
char s[100];
int i=0,a[100],sum=0;
scanf("%s",s);
printf("%c\n",s[5]);

while(s[i]!='#')
{
if((s[i]>='0')&&(s[i]<='9'))
{
printf("%c",s[i]);
a[i]=1;
}
else
{
a[i]=0;
}

if(a[i-1]==

1&&a[i]==0)
{
sum++;
printf(" ");
}
i++;
}
printf("\n共有:%d",sum);
}




相关文档
相关文档 最新文档