大数据2班第11周第二次堂测
1 矩阵行交换或列交换
题目要求对二维数组元素的行与行进行交换,以及列与列进行交换,而且也已经给出了交换函数swap,这里只需要简单的写个循环改变行或列然后调用swap函数即可。
比如我要交换1和3行,那么只需要写个循环让列j从0-3列,每一次只用swap(&a[0][j],&a[2][j]),就可以对这一列下我要的两行元素进行调换了。由于swap函数的形参是个指针变量,所以当调用函数的时候也应该把对应的元素地址交给函数,这里需要加个取址符号&。
$block1$
int k;
for(k=0; k<4; k++)
swap(&a[k][i], &a[k][j]);
$end1$
$block2$
int k;
for(k=0; k<4; k++)
swap(&a[i][k], &a[j][k]);
$end2$
2. 求函数值
比较简单的一题,只需要照着题目调用递归函数即可,唯一需要注意的便是因为f函数是用到了g函数的,定义f函数之前就要先把g函数先定义了。
#include <stdio.h>
#include <stdlib.h>
int g(int x)
{
if(x<2) return x;
if(x>=2&&x%2==0) return (g(x/2)+1);
if(x%2!=0) return x;
}
int f(int x)
{
if(x<2) return x;
if(x>=2&&x%2==0) return g(x/2)*2;
if(x>=2&&x%2!=0) return g((x-1)/2);
}
int main()
{
int n, res;
scanf("%d",&n);
res=f(n);
printf("%d\n",res);
}
3 二进制加法
其实就是高进度加法的变种,照猫画虎即可。只是原来的十进制改为了二进制,除10余10的操作全替换成除2余2就行了。为了对比,这里放上“高精度加法”的标程
#include "stdio.h"
#include "string.h"
main()
{ int a[100]={0},b[100]={0},c[100]={0};
char s[101];
int i=0,n1=0,n2=0,max=0,e=0;
gets(s);
n1=strlen(s);
for(i=n1-1;i>=0;i--) a[n1-1-i]=s[i]-'0';
gets(s);
n2=strlen(s);
for(i=n2-1;i>=0;i--) b[n2-1-i]=s[i]-'0';
if(n1>n2) max=n1;
else max=n2;
for(i=0;i<=max;i++)
{ c[i]=(a[i]+b[i]+e)%10;
e=(a[i]+b[i]+e)/10;
}
if(c[max]>0) printf("%d",c[max]);
for(i=max-1;i>=0;i--)
printf("%d",c[i]);
}
这题你需要做的只是将倒数第二个循环里面的进位机制改一下就可以了
#include "stdio.h"
#include "string.h"
main()
{ int a[100]={0},b[100]={0},c[100]={0};
char s[101];
int i=0,n1=0,n2=0,max=0,e=0;
gets(s);
n1=strlen(s);
for(i=n1-1;i>=0;i--) a[n1-1-i]=s[i]-'0';
gets(s);
n2=strlen(s);
for(i=n2-1;i>=0;i--) b[n2-1-i]=s[i]-'0';
if(n1>n2) max=n1;
else max=n2;
for(i=0;i<=max;i++)
{ c[i]=(a[i]+b[i]+e)%2; //余2
e=(a[i]+b[i]+e)/2;// 除2
}
if(c[max]>0) printf("%d",c[max]);
for(i=max-1;i>=0;i--)
printf("%d",c[i]);
}