吉大软件专硕-2007

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21149391/article/details/79456981


一、(30分)编写一程序,输入由一个'0'、'1'组成的字符序列,结束标志为'#',输出对应的十进制数。

例如:输入 1 0 0 

         输出  4

注:假设没有溢出

思路:无,有关求字符串长度的一点儿小注意:

1. strlen函数求得的字符串长度是从字符串第一个元素到第一个'\0'之间元素的个数(如果字符串中间有'\0',则结果不是整个字符串的长度),同时不包括该'\0'
2. sizeof求得的结果是存储该字符串的变量占用的空间大小,因而一定会包括'\0'.若'\0'后还有空余的空间,也会包含到结果里面

#include<stdio.h>  
#include<math.h> 
#define N 100
int main(){
	int convert(char *str);
    char str[N];
  	printf("请输入二进制数,以#结束:");
	gets(str);
	int result = convert(str);
    printf("相应的十进制为:%d\n",result); 
} 
int convert(char *str){
	char s;
    int i;
    int len;
    int result=0;
    len = strlen(str);
	for(i=0;(s=str[i])!='#';i++)
		if(s=='1')
			result += pow(2,len-2-i);
	return result;
}



#include<stdio.h> 
#define N 11
int A[N]={9,8,8,8,8,7,3,3,1,1,1};//定义全局变量数组 
int main(){
	void FindMax();
	FindMax();
	return 0;
}
void FindMax(){
	int platform[N][2];
	int i,j,k;
	int max,max_i;
	//初始化initialize
	platform[0][0] = A[0];
 	platform[0][1] = 1;
 	j=0;
 	max = 0;
 	max_i=0;
 	
	for(i=1;i<N;i++)
		if(A[i]!=A[i-1]){
			j++;
			platform[j][0] = A[i];
			platform[j][1] = 1;
		}else
			platform[j][1]++;
	printf("有%d个平台:\n",j+1);
	for(i=0;i<=j;i++){
		printf("平台%d,长度为%d\n",platform[i][0],platform[i][1]);
		if(platform[i][1]>max){
			max = platform[i][1];
			max_i = i;
		}
	}
	
 	printf("最长的平台为:%d,其长度为:%d\n",platform[max_i][0],max);
}

递归遍历编写十分简单,然后我选了非递归写=-=,重新学一遍实现队列吧。。。。。

简单的遍历,但是用C编译出来需要实现栈或队列,用到三个文件:

Node.h:定义树的结构,并创建一个如例图的树

Queue.h:实现队列的基本操作

test.c:实现遍历,计算得

注:初始化问题

Node.h:

#ifndef _TEST_H_
#define _TEST_H_
#include <stdio.h>
#define LEN sizeof(struct tree)

struct  tree{
	int value;
	struct tree *left,*right;
};
struct tree *creat(void){
	struct tree *root;
	struct tree *p1,*p2,*p3,*p4,*p5;
	root=(struct tree *)malloc(LEN);
	p1=(struct tree *)malloc(LEN);
	p2=(struct tree *)malloc(LEN);
	p3=(struct tree *)malloc(LEN);
	p4=(struct tree *)malloc(LEN);
	p5=(struct tree *)malloc(LEN);
	
	root->value = -4; 
	p1->value = 5;
	p2->value = 10;
	p3->value = -3;
	p4->value = 20;
	p5->value = 7;

	root->left = p1;
	root->right = p2;
	p1->left = p3;
	p1->right = NULL;
    p2->left = p4;
	p2->right = p5;
	p3->left = NULL;
	p3->right = NULL;
	p4->left = NULL;
	p4->right = NULL;
	p5->left = NULL;
	p5->right = NULL;
	return (root);
}
#endif

Queue.h:

#include <stdio.h>  
#include <stdlib.h>
#include "Node.h"// 双引号,引入tree类型 
#define QueueSize 20
#define DataType struct tree
typedef struct {
    DataType data[QueueSize];
    int front;
    int rear;
    int count;
}Queue;

//初始化队列
void initQueue(Queue *Q)
{
    Q->front = 0;
    Q->rear = 0;
    Q->count = 0;
}

//队列是否为空
int QueueEmpty(Queue *Q){
	return (Q->count == 0);
}

//队列是否满
int QueueFull(Queue *Q){
    return (Q->count == QueueSize);
}

//入队
void enQueue(Queue *Q, DataType v){
    if(QueueFull(Q))
        printf("Error, the queue is full!");
    Q->data[Q->rear] = v;
    Q->rear = (Q->rear+1)%QueueSize; //循环,防止rear大于QueueSize;
    Q->count++;
}

//出队
DataType deQueue(Queue *Q){
    DataType i;
    if(QueueEmpty(Q))
        printf("Error, the queue is empty");
    i = Q->data[Q->front];
    Q->front = (Q->front+1)%QueueSize; //循环
    Q->count--;
    return i;
}

//读队头元素,不改变对状态
DataType ReadQueue(Queue *Q){
    DataType i;
    if(QueueEmpty(Q))
        printf("Error, the queue is empty");
    i = Q->data[Q->front];
    return i;
}

test.c:

#include <stdio.h>
#include "Queue.h"
#include "Node.h"
 int main()
{
    Queue Q;
    struct tree *root = creat();
    struct tree *p = root;
    int result = 0;
    initQueue(&Q);
    enQueue(&Q,*root);

    while(!QueueEmpty(&Q)){//简单的层次遍历 
    	*p = deQueue(&Q);//如果p没初始化,就这句话会崩掉!!!!! 
    	result += p->value;
    	if(p->left!=NULL) enQueue(&Q,*p->left);
    	if(p->right!=NULL) enQueue(&Q,*p->right);
    }
	printf("result = %d\n", result);
    return 0;
}

运行结果:



#include<stdio.h>  
#define N 100
int main(){
	int FindMax(int *A,int i,int max);
    int A[N];
    int i;
    for(i=0;i<N;i++){
    	A[i]=rand()%100;//产生0~100的随机数
    	printf("%d\t",A[i]);
    }
    int n=FindMax(A,1,A[0]);
	printf("\n最大的是:%d\n",n);
    return 0;
}
int FindMax(int *A,int i,int max){
	if(i<N){
		if(A[i] > max)
			max= FindMax(A,i+1,A[i]);
         else 
		 	max=FindMax(A,i+1,max);
	}
    return max;
}


#include<stdio.h>
#define N 100
int main(){
    int x,i;
    int ser[N];
    int *series(int x,int *series);
    printf("输入x:");
    scanf("%d",&x);
    int *s = series(x,ser);
    for(i=0;i<N;i++){//打印输出,并存于ser数组中
        printf("%d\t",s[i]);
        ser[i] = s[i];
    }
    return 0;
}
int* series(int x,int *series){
    series[0] = x;
    int i,j,k,t,item,sign;
    j=1;
    
    for(i=0;i<N&&j<N;i++){
        sign = 0;//每次sign置零
        item = series[i]*2;//先处理2x
        for(k=i;k<j;k++){
            if(series[k]> item){//找到第一个大于2x的数,将2x插入这里,其余向后移一位
                for(t=j;t>k;t--)
                    series[t] = series[t-1];
                series[k] = item;
                j++;
                sign = 1;
                break;
            }else if(series[k] == item){//若找到相同,则不做任何处理
                sign = 1;
                break;
            }
        }if(sign == 0){//若以上两种情况都没遇到,则说明2x最大,放在最后
            series[j] = item;
            j++;
        }
        sign = 0;//对于3x同样处理
        item = series[i]*3;
        for(k=i;k<j;k++){
            if(series[k]> item){
                for(t=j;t>k;t--)
                    series[t] = series[t-1];
                series[k] = item;
                j++;
                break;
            }else if(series[k] == item)
                break;
        }if(sign == 0){
            series[j] = item;
            j++;
        }
    }
    return series;
}


思路:二进制法

类似题:967-2014年第四题(http://blog.csdn.net/qq_21149391/article/details/79411106)

967-2015年第四题(http://blog.csdn.net/qq_21149391/article/details/79405192)

上两题是,求元素个数为2,3的子集,当把限定:当n==2时输出,变成所有的二进制位Binary[j]==1时的,对应的num[j]打印,即为全部的子集

10个元素的全部子集太大,用元素个数N=4的数组测试编程,如下:

#include<stdio.h>  
#include<math.h> 
#define N 4
int main(){
	void FindSubset(int *num);
    int num[N]={0,1,2,3};//10个数该这里就好,为了方便观察,用4个测试 
	FindSubset(num);
    return 0;
}
void FindSubset(int *num){
    int Binary[N]={0};
	int i,j;
	for(i=0;i<pow(2,N);i++){
		Binary[0]++;
		printf("{");
		for(j=0;j<N;j++){
			if(Binary[j]==2){
				Binary[j+1] ++;
				Binary[j] = 0;
			}
			if(Binary[j]==1){
				printf("%d,",num[j]);
			}
		}
		printf("}\n");
	}
}

运行结果,包括空集:


猜你喜欢

转载自blog.csdn.net/qq_21149391/article/details/79456981