吉大軟體專碩-2007
阿新 • • 發佈:2018-11-01
一、(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");
}
}
執行結果,包括空集: