高级语言第四章,数学集合与进制

1.试编写一个程序,使得它打印出M的前100个最小数,设集合M的定义如下:

a)整数1属于集合M

b)如果n属于M,则y=2*n+1和z=3*n+1也属于M

c)再没有别的整数属于M,M=(1,3,4,7,9,10)

#include <stdio.h>

int a[200];
void insert(int k) {
	int i;
	for(i=0; i<200; i++)
		if(a[i]==k)
			return;
	for(i=199; i>=0; i--) {
		if(a[i]==0)
			continue;
		if(k<a[i])
			a[i+1]=a[i];
		else {
			a[i+1]=k;
			return;
		}
	}
}

int main() {
	int count=0,n,i,y,z;
	a[0]=1;
	for(i=0; i<200; i++) {
		n=a[i];
		printf("%d ",a[i]);
		count++;
		y=2*n+1;
		z=3*n+1;
		insert(y);
		insert(z);
		if(count==100)
			break;
	}
	return 0;
}

2.编写一个程序,对输入的任意正整数n,打印出集合{0,1,2,3,4,...,n-1}的所有子集,例如:输入3时,输出是{},{0},{1},{0,1},{2},{0,2},{1,2},{0,1,2}

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

void powerset(int n) {
	int m=pow(2,n);
	int subsets[n];
	int nums;
	for(int i=0; i<m; i++) {
		printf("{");
		nums=0;
		for(int j=0; j<n; j++)
			if(i&(1<<j)) 
				subsets[nums++]=j;
		for(int j=0; j<nums; j++) {
			printf("%d",subsets[j]);
			if(j<nums-1)
				printf(",");
		}
		printf("}");
	}
}

int main() {
	int n;
	scanf("%d",&n);
	powerset(n);
	return 0;
}
#include <stdio.h>

void generateSubsets(int *str,int n,int subset[], int subsetSize, int index) {
	printf("{ ");
	for (int i = 0; i < subsetSize; i++)
		printf("%d ", subset[i]);
	printf("}\n");
	for (int i = index; i < n; i++) {
		subset[subsetSize] = str[i];
		generateSubsets(str, n,subset, subsetSize + 1, i + 1);
	}
}

int main() {
	int n;
	scanf("%d",&n);
	int *arr=(int *)malloc(sizeof(int)*n);
	for(int i=0; i<n; i++)
		arr[i]=i;
	int subset[10];
	generateSubsets(arr,n,subset, 0, 0);
	return 0;
}

3.写一个函数,输入一个16进制数,输出对应的十进制数

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 10

int fun(char array[]){
	int digit;
	int sum=0;
	for(int i=0;i<strlen(array);i++){
		if(array[i]>='0'&&array[i]<='9')
			digit=array[i]-'0';
		else if(array[i]>='A'&&array[i]<='F')
			digit=array[i]-'A'+10;
		else if(array[i]>='a'&&array[i]<='z')
			digit=array[i]-'a'+10;
		sum=sum+digit*pow(16,strlen(array)-i-1);
	}
	return sum;
}

int main(){
	char array[N];
	scanf("%s",array);
	printf("%d",fun(array));
	return 0;
}

4.将一个十进制整数转换为二进制数输出

#include <stdio.h>

int fun(int n){
	if(n>1) fun(n/2);
	printf("%d",n%2);
}

int main(){
	int n;
	scanf("%d",&n);
	fun(n);
	return 0;
}

5.假设用整型数组存储二进制数,即数组的一个元素存放二进制数的一位数,编写函数实现该存储形式的二进制数的加一操作

#include <stdio.h>

int addone(int *a,int n) {
	int add=1;
	for(int i=n-1; i>=0; i--) {
		int temp=a[i]+add;
		a[i]=temp%2;
		add=temp/2;
	}
	if(add!=0) {
		for(int i=n; i>0; i--)
			a[i]=a[i-1];
		a[0]=add;
		n+=1;
	}
	for(int i=0; i<n; i++)
		printf("%d ",a[i]);
}

int main() {
	int a[10];
	for(int i=0; i<5; i++)
		scanf("%d",&a[i]);
	addone(a,5);
	return 0;
}

6.C语言中没有集合类型,为了模拟集合运算可以将正整数集合用”稀疏数组“来存储,即集合的整数位置上的数组值为1,其他位置为0,分别编写函数来计算两个”稀疏数组“的交集和并集

#include <stdio.h>
#include <stdlib.h>
int *Intersection(int *a,int an,int *b,int bn) {
	int cn=an>bn?bn:an;
	int *C;
	C=(int*)malloc(sizeof(int)*cn);
	for(int i=0; i<cn; i++) {
		if(a[i]==b[i]&&b[i]==1)
			C[i]=1;
		else
			C[i]=0;
	}
	return C;
}

int *Union(int *a,int an,int *b,int bn) {
	int cn=an>bn?an:bn;
	int dn=an>bn?bn:an;
	int *C;
	C=(int*)malloc(sizeof(int)*cn);
	for(int i=0; i<dn; i++) {
		if(a[i]==1||b[i]==1)
			C[i]=1;
		else
			C[i]=0;
	}
	if(an>bn)
		for(int j=dn; j<an; j++)
			C[j]=a[j];
	else 
		for(int j=dn; j<bn; j++)
			C[j]=b[j];
	return C;
}

int main() {
	int list1[10];
	int list2[10];
	for(int i=0; i<5; i++)
		scanf("%d",&list1[i]);
	for(int i=0; i<8; i++)
		scanf("%d",&list2[i]);
	int *F = Intersection(list1,5,list2,8);
	for(int i=0; i<5; i++)
		printf("%d ",F[i]);
	printf("\n");
	int *T = Union(list1,5,list2,8);
	for(int i=0; i<8; i++)
		printf("%d ",T[i]);
	free(T);
	return 0;
}

7.设有一个包含N个数的集合S,编写函数求S的所有元素个数为M的子集

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

void powerset(int n,int flag) {
	int m=pow(2,n);
	int subsets[n];
	int nums;
	for(int i=0; i<m; i++) {
		nums=0;
		for(int j=0; j<n; j++)
			if(i&(1<<j))
				subsets[nums++]=j;
		if(nums==flag) {
			printf("{");
			for(int j=0; j<nums; j++) {
				printf("%d",subsets[j]);
				if(j<nums-1)
					printf(",");
			}
			printf("}");
		}
	}
}

int main() {
	int n,nums;
	scanf("%d %d",&n,&nums);
	powerset(n,nums);
	return 0;
}

8.求任意两个不同进制非负整数的转换

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 10

int fun(int a,char array[],int b) {
	int digit;
	int sum=0;
	for(int i=0; i<strlen(array); i++) {
		if(array[i]>='0'&&array[i]<='9')
			digit=array[i]-'0';
		else if(array[i]>='A'&&array[i]<='F')
			digit=array[i]-'A'+10;
		else if(array[i]>='a'&&array[i]<='f')
			digit=array[i]-'a'+10;
		sum=sum+digit*pow(a,strlen(array)-i-1);
	}
	char ans[N],size=0;
	while (sum > 0) {
		int x = sum % b;
		ans[size++] = (x < 10) ? x + '0' : x - 10 + 'A';
		sum /= b;
	}
	for(int i=size-1; i>=0; i--)
		printf("%c",ans[i]);
	printf("\n");
}

int main() {
	char array[N];
	int a,b;
	scanf("%d %s %d",&a,array,&b);
	fun(a,array,b);
	return 0;
}

9.编写一程序,输入由一个‘0’,‘1’组成的字符串序列,结束标志为*,输出对应的十进制数

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 10

int fun(int a, char array[], int b) {
    int digit;
    int sum = 0;
    for (int i = 0; i < strlen(array); i++) {
        if (array[i] >= '0' && array[i] <= '9')
            digit = array[i] - '0';
        else if (array[i] >= 'A' && array[i] <= 'F')
            digit = array[i] - 'A' + 10;
        else if (array[i] >= 'a' && array[i] <= 'f')
            digit = array[i] - 'a' + 10;
        sum = sum + digit * pow(a, strlen(array) - i - 1);
    }
    char ans[N], size = 0;
    while (sum > 0) {
        int x = sum % b;
        ans[size++] = (x < 10) ? x + '0' : x - 10 + 'A';
        sum /= b;
    }
    for (int i = size - 1; i >= 0; i--)
        printf("%c", ans[i]);
    printf("\n");
}

int main() {
    char array[N],ch;
    int a, b,i = 0;
    while ((ch = getchar()) != '*') {
        array[i] = ch;
        i++;
    }
    array[i] = '\0';
    fun(2, array, 10);
    return 0;
}

10.编写一程序,输入一个十进制数,输出与之等价的八进制数

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 10

int fun(int a,char array[],int b) {
	int digit;
	int sum=0;
	for(int i=0; i<strlen(array); i++) {
		if(array[i]>='0'&&array[i]<='9')
			digit=array[i]-'0';
		else if(array[i]>='A'&&array[i]<='F')
			digit=array[i]-'A'+10;
		else if(array[i]>='a'&&array[i]<='f')
			digit=array[i]-'a'+10;
		sum=sum+digit*pow(a,strlen(array)-i-1);
	}
	char ans[N],size=0;
	while (sum > 0) {
		int x = sum % b;
		ans[size++] = (x < 10) ? x + '0' : x - 10 + 'A';
		sum /= b;
	}
	for(int i=size-1; i>=0; i--)
		printf("%c",ans[i]);
	printf("\n");
}

int main() {
	char array[N];
	int a,b;
	scanf("%s",array);
	fun(10,array,8);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值