高级语言讲义2017计专(仅高级语言部分)

文章描述了如何定义和实现一个函数处理整数,提取奇数位形成新数,以及编程任务涉及杨辉三角的生成和二进制环的构造,还包括链表的并集操作和排序算法的应用。
摘要由CSDN通过智能技术生成

1.定义并实现一个函数,它带有一个整型参数S,,其功能是:把S的每个数字位上为奇数的数字依次取出,构成一个新的整数,高位仍在高位,低位仍在低位,所构成的新的整数是该函数的返回结果。例如,当S为987312时,函数返回结果是9731。若S中不存在奇数数字,返回0值。编写该函数时,不必考虑参数S及返回结果的正负号问题。

#include <stdio.h>

void func(int n) {
	int count=0,temp=n;
	while(temp!=0) {
		count++;
		temp/=10;
	}
	int flag=0;
	int sum=0;
	int *arr=(int *)malloc(sizeof(int)*count);
	for(int i=0; i<count; i++) {
		arr[count-i-1]=n%10;
		n/=10;
	}
	for(int i=0; i<count; i++)
		if(arr[i]%2==1) {
			printf("%d",arr[i]);
			flag=1;
		}
	if(flag==0)
		printf("0");
}

int main() {
	int n;
	scanf("%d",&n);
	func(n);
}

2.杨辉三角是二项式系数在三角形中的一种几何排列,其中,顶点(第一行)只有元素1; 第i行有i个元素;当i> 1时,第i行的最左边与最右边的元素均为1,其余的每个元素均是其左、右斜上方两个元素之和。编写一个完整程序,对于输入的正整数n,输出杨辉三角形的第n行元素。注意:不需要打印完整三角形,只需把第n行元素依次输出

#include <stdio.h>
#include <stdlib.h>

void show(int **arr,int n) {
	for(int i=0; i<n; i++) {
		for(int j=0; j<=i; j++)
			printf("%d ",arr[i][j]);
		printf("\n");
	}
}

void init(int **arr,int n) {
	for(int i=0; i<n; i++) {
		for(int j=0; j<n; j++)
			arr[i][j]=0;
	}
}

void yanghui(int **arr,int n) {
	for(int i=0; i<n; i++)
		for(int j=0; j<=i; j++)
			if(j==0||j==i)
				arr[i][j]=1;
			else
				arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
}

int main() {
	int n;
	scanf("%d",&n);
	int **arr=(int **)malloc(sizeof(int *)*n);
	for(int i=0; i<n; i++)
		arr[i]=(int *)malloc(sizeof(int)*n);
	init(arr,n);
	yanghui(arr,n);
	show(arr,n);
}

3.下图是有2^{3}个二进制数字组成的环,由3个二进制数组构成的2^{3}中不同的数字序列恰好在该环中出现一次,例如从箭头位置(00010111)开始按顺时针方向每三个连续的二进制数字构成的序列各不相同,他们所代表的的十进制依次为 0,1,2,5,3,7,6,4。编写一个完整程序,该程序对于输入的正整数n,生成由2^{n}个二进制构成的环,使得从环中每个不同的位置的数字开始按顺时针方向构成的长度为n的二进制序列各不相同,编程过程中,环的表示方式任意,程序输出结果是一个由2^{n }个二进制数字构成的序列,用它表示为求得的环该序列可以从换种的任何一个位置上的数字开始。
 

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>

bool islegal(int *path, int n) {
	int power = pow(2,n);
	int *visited=(int *)malloc(sizeof(int)*power);
	for(int i=0; i<power; i++)
		visited[i]=0;
	for(int i=0; i < power; i++) {
		int p = 1;
		int num = 0;
		for(int j=0; j < n; j++) {
			num += path[(i+j)%power]*p;
			p = p*2;
		}
		if(visited[num] == 1)
			return false;
		visited[num] = 1;
	}
	return true;
}

void outprg(int n) {
	int power = pow(2,n);
	int *path=(int *)malloc(sizeof(int)*power);
	for(int i=0; i<power; i++)
		path[i]=0;
	while(1) {
		int j = 0;
		while(path[j]==1)
			path[j++] = 0;
		path[j] = 1;
		if(islegal(path,n)==true) {
			for(int i =0; i < power; i++)
				printf("%d  ", path[i]);
			return;
		}
	}
}

int main() {
	outprg(3);
}

4.假设用链表表示由整型元素构成的有限集合,集合{1,3,4}可表示Q->1->3->4

定义并实现一个函数UnionSet,它有两个参数Q和P,分别代表两个不用的链表,每个链表均用来表示由若干整型元素构成的集合,该集合返回一个新的链表R,R表示Q所代表的集合与P所代表的集合的并集,例如,若另有链表P->1->5->3

则执行UnionSet(Q,P)可以返回下面链表:R->1->3->4->5

要求:再定义该函数之前,需要给出链表相关的数据类型定义,即给出链表的数据表示方法,函数的两个参数链均属于输入型参数,不必用实际数据构成他们。

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
	int key;
	struct node *next;
} node;

struct node *sort(struct node *head) {
	struct node *p=head,*q,*tail;
	int n;
	while(p->next!=NULL) {
		n++;
		p=p->next;
	}
	for(int i=0; i<n-1; i++) {
		q=head->next;
		p=q->next;
		tail=head;
		for(int j=0; j<n-i-1; j++) {
			if(q->key>p->key) {
				q->next=p->next;
				p->next=q;
				tail->next=p;
			}
			tail=tail->next;
			q=tail->next;
			p=q->next;
		}
	}
}

struct node *merge(struct node *P,struct node *Q) {
	struct node *p = sort(P),*q=sort(Q);
	struct node *head=(struct node*)malloc(sizeof(struct node));
	head->next=NULL;
	struct node *rear=head;
	while(p!=NULL&&q!=NULL) {
		if(p->key==q->key)
			p=p->next;
		else if(p->key<q->key) {
			rear->next=p;
			rear=p;
			p=p->next;
		} else {
			rear->next=q;
			rear=q;
			q=q->next;
		}
	}
	if(p!=NULL)
		rear->next=p;
	else
		rear->next=q;
	return head->next;
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值