版权声明:本文为博主原创文章,未经博主允许不得转载。 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");
}
}
运行结果,包括空集: