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;
}