1. 程式人生 > >吉大軟體專碩-2007

吉大軟體專碩-2007


一、(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");
	}
}

執行結果,包括空集: