题目一
思路解析
就是两两找交集,再把找到的交集和下一排找交集;考虑到有很多交集,于是我决定写一个函数来解决;
关键点
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;
}
题目二
思路解析
跟昨天的高精度加法差不多,先用字符串读入数字,再用数组算计
关键点
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;
}