20级大数据1班第6次堂测题解

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;
}
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值