函数返回数组(找交集问题)& 高精度乘法

47 阅读3分钟

题目一

image.png

思路解析

就是两两找交集,再把找到的交集和下一排找交集;考虑到有很多交集,于是我决定写一个函数来解决;

关键点

1.函数返回数组一定是要malloc过的
2.我们写函数的时候只有第一次的比较数组是5个数字,后面要不断更新size
3.可以直接把函数返回的数组赋值给一个数组,不用通过遍历来赋值
4.函数返回的数组用完记得free

我的代码

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

int* coNum(int a[],int sizeA,int b[],int sizeB,int* returnsize);
int main()
{
	int arr[5][5]={12,35,3,9,0,
			2,35,9,12,1,
			35,12,0,1,9,
			4,90,35,9,12,
			11,9,0,12,35};
	int set_1[5]={0},set_2[5]={0},
		set_3[5]={0},set_4[5]={0},
		set_0[5]={0};
	
	int i,j;
	for(i=0;i<5;i++){  //其实这里可以用二维数组但我傻了
		set_0[i]=arr[0][i];
		set_1[i]=arr[1][i];
		set_2[i]=arr[2][i];
		set_3[i]=arr[3][i];
		set_4[i]=arr[4][i];
	}
	
	int *newset_1,*newset_2,
		*newset_3,*newset_4=NULL;
	
	int size0=5,size1;
	newset_1=coNum(set_0,size0,set_1,size0,&size1);
	
	int size2;
	newset_2=coNum(newset_1,size1,set_2,size0,&size2);
	free(newset_1);//及时释放
	
	int size3;
	newset_3=coNum(newset_2,size2,set_3,size0,&size3);
	free(newset_2);
	
	int size4;
	newset_4=coNum(newset_3,size3,set_4,size0,&size4);
	free(newset_3);
		
	for(i=0;i<size4;i++){
		printf("%d ",newset_4[i]);
	}
	
	free(newset_4);
	
	return 0;
}
int* coNum(int a[],int sizeA,int b[],int sizeB,int* returnsize) //由于要算很多遍交集,这里直接写一个求交集函数 
{
	int i,j,cnt=0;
	
	int maxSize=sizeA < sizeB ? sizeA : sizeB;
	int* temp=(int*)malloc(maxSize*sizeof(int)); //这里malloc是为了保险 
	for(i=0;i<sizeA;i++){
		for(j=0;j<sizeB;j++){
			if(a[i]==b[j]){
				temp[cnt++]=a[i];
				break;
			}
		}
	}
	
	int *conum=(int*)malloc(cnt*sizeof(int)); //这里必须malloc不然带不出函数 
	for(i=0;i<cnt;i++){
		conum[i]=temp[i];
	}
	
	*returnsize=cnt;
	free(temp);
	return conum;
}

题目二

image.png

思路解析

跟昨天的高精度加法差不多,先用字符串读入数字,再用数组算计

关键点

1.现在的最大位数是两个数字的位数之和了而不是两个最大位数加1

2.有一点我还是有点稀里糊涂,但是我知道的就是重要核心三句代码分开了

我的代码

#include<stdio.h>
#include<string.h>

int main()
{
   char s1[2005],s2[2005];
   int a[2005]={0},b[2005]={0},c[4005]={0};
   
   scanf("%s",&s1);
   scanf("%s",&s2);
   
   int lenA=strlen(s1);
   int lenB=strlen(s2);
   
   int i,j;
   for(i=0;i<lenA;i++){
   	a[i]=s1[lenA-i-1]-'0';
   }
   for(i=0;i<lenB;i++){
   	b[i]=s2[lenB-i-1]-'0';
   }
   
   int lenC=lenA+lenB;
   for(i=0;i<lenA;i++){
   	for(j=0;j<lenB;j++){
   		c[i+j]+=a[i]*b[j];//注意这里
   	}
   	for(j=0;j<lenB;j++){
   		c[i+j+1]+=c[i+j]/10;//和上面注意的地方分开来了
   		c[i+j]%=10;
   	}
   }
   
   
   while(c[lenC-1]==0 && lenC>1) lenC--;
   for(i=lenC-1;i>=0;i--){
   	printf("%d",c[i]);
   }
   
   return 0;
}