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.下图是有个二进制数字组成的环,由3个二进制数组构成的
中不同的数字序列恰好在该环中出现一次,例如从箭头位置(00010111)开始按顺时针方向每三个连续的二进制数字构成的序列各不相同,他们所代表的的十进制依次为 0,1,2,5,3,7,6,4。编写一个完整程序,该程序对于输入的正整数n,生成由
个二进制构成的环,使得从环中每个不同的位置的数字开始按顺时针方向构成的长度为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;
}