20级大数据1班第6次堂测题解
本次堂测的所有题都是做过的,所以下面的题解只提供答案,同学们现在要做得是总结做题方法。
1 [填空题]十进制数转二进制数
#include <stdio.h>
//1.运用数组存取余数,然后倒序输出
void binary(int n);
{
int a[10000],i=0,j;
while(n!=0)
{
a[i]=n%2;
n=n/2;
i++;
}
for(j=i-1;j>=0;j--)
{
printf("%d",a[j]);
}
}
//2.利用函数递归将十进制转化为二进制
void binary(int n)
{
if (n>1)
binary(n/2);
printf("%d",n%2);
}
int main()
{
int n;
scanf("%d", &n);
binary(n);
}
2 求函数值2
#include <stdio.h>
#include <string.h>
int F(int n); //这里一定要先定义,养成好习惯
int G(int n);
int main()
{
int n;
scanf("%d",&n);
printf("%d",F(n));
return 0;
}
//写函数就按照题目要求即可
int F(int n)
{
if(n<2)
return n;
else if(n>=2&&n%2==0)
return G(n/2)*2;
else if(n>=2&&n%2==1)
return G((n-1)/2);
}
int G(int n)
{
if(n<2||n%2==1)
return n;
else if(n>=2&&n%2==0)
return G(n/2)+1;
}
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>
int main()
{
int i,j,k,len1,len2,len;
char k1[100],k2[100];
int m1[100],m2[100],m[101];
scanf("%s",k1);
scanf("%s",k2);
len1=strlen(k1);
len2=strlen(k2);
for(i=0; i<len1; i++)
{
m1[i]=k1[len1-1-i]-'0';
}
for(i=0; i<len2; i++)
{
m2[i]=k2[len2-1-i]-'0';
}
if(len1>len2)
{
for(i=len2; i<len1; i++)
{
m2[i]=0;
}
len=len1;
}
if(len2>=len1)
{
for(i=len2; i<len2; i++)
{
m1[i]=0;
}
len=len2;
}
k=0;
for(j=0; j<len; j++)
{
m[j]=m1[j]+m2[j]+k;
if(m[j]>=2)
{
k=1;
m[j]=m[j]-2;
}
else
{
k=0;
}
if(j==len-1&&k==1)
{
j++;
m[j]=k;
}
}
for(i=j-1; i>=0; i--)
{
printf("%d",m[i]);
}
return 0;
}
4 [填空]函数实现求字符串长度
$block1$
int f(char s[])
{
int i,count=0;
for(i=0; s[i]!='\0'; i++)
count++;
return count;
}
$end1$
5 计算组合数
这道题只需要写个算阶乘的函数即可
#include <stdio.h>
#include <string.h>
#include <math.h>
int k(int m)
{
int sum=1,i;
for(i=1;i<=m;i++)
sum=sum*i;
return sum;
}
int main()
{
int m,n,sum;
scanf("%d%d",&m,&n);
sum=k(m)/k(m-n)/k(n);
printf("%d",sum);
}
6 因子和
注意题目求因子和的时候不能加上本身
#include <stdio.h>
//编写函数求因子和
int sum(int n)
{
int i,s=0;
for (i=1;i<n;i++) //注意是小于n,不需要算上本身
{
if (n%i==0)
s+=i; //满足是因子累加
}
return s;
}
int main()
{
int i,count=0,m;
scanf("%d",&m);
for (i=1;i<=10000;i++)
{
if (sum(i)==m) //判断是否满足给定因子和与m相等
printf("%d\n",i);
}
return 0;
}