计算机导论-第二次机考答案参考

函数题

6-1 亲和数

思路:分别求出num1,num2的所有约数之和,判断是不是互相相等

int sum_dividor(int num){//求num这个数各个约数的和
    int re=0;
    for(int i=1;i<num/2+1;i++){//遍历1~num/2+1
        if(num%i==0){//找到约数
            re+=i;//加到总和中
        }
    }
    return re;
}

int isAmicable(int number1 , int number2 ){
    int sum1=sum_dividor(number1);//number1约数
    int sum2=sum_dividor(number2);//number2约数
    if(sum1==number2&&sum2==number1){//是
        return 1;
    }
    else{//否
        return 0;
    }

}

6-2 数字重组

思路:根据position将数字拆分成三部分,重新组合

long long recombination(long long num , int position)
{
    long long re=0;//结果变量
    long long first=0,second=0,third=0;//first,second,third为num的三个部分
    long long se_div=1,th_div=1;//取出第二部分、第三部分需要用到的工具变量
    int num_length=0;//位数
    
    //获得num的位数
    long long temp=num;
    while(temp!=0){
        num_length++;
        temp/=10;
    }
    //获得取出第二部分、第三部分需要用到的工具变量
    int div_length=num_length-position;
    for(int i=1;i<=div_length;i++)
    {
        th_div*=10;
    }
    se_div=th_div*10;
    //数据分割
    second=num%se_div;
    first=num-second;//第一部分
    third=num%th_div;//第三部分
    second=(second-third)/th_div;//第二部分
    //数据重组
    re=first+third*10+second;
    
    return re;
}

编程题

7-1 算数

思路:运算倒退,计算顺序是:(x*3-5)*3-5……=m,则倒退计算(m+5)/3重复n次得到原始值


#include<stdio.h>
int main(){
    int n,m;//重复次数,最终结果
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++){//0~n-1,计算n次
        m=(m+5)/3;//m每一次更新,最终存储原始值
    }
    printf("%d",m);
    return 0;
}

7-2 多少个一

思路:穷举1,11,111,……,直到找到n的倍数

#include <stdio.h>
int main()
{
    int n,count = 1;
    long long beishu = 1;
        
    scanf("%d", &n);
    while(beishu%n!=0){//不是n的倍数
       beishu=beishu*10+1;
        count++;//位数+1
    }
    printf("%d",count);
    return 0;
}

7-3 棋盘

思路:归纳数学规律,总的子棋盘数和正方形数量比较好求,求这两个来得到长方形的数量。
难点:数学规律归纳。
总的子棋盘数:长有1到m种情况,宽有1到n种情况。
正方形数量:根据正方形边长的情况和每种情况的数量来归纳总结。

#include<stdio.h>

int main()
{
    int m;//短边
    int n;//长边
    scanf("%d %d",&m,&n);
    
    int temp=0;
    if(n<=m)
    {
       temp=n;
       n=m;
       m=temp;
    }//保证m<n
    
    int sum=m*(m+1)/2*n*(n+1)/2;//总共有的子棋盘数
    //1+2+……+m 
    //1+2+……+n
    
    int tri=0;//正方形数量
    for(int i=0;i<m;i++){
       tri+=(m-i)*(n-i);
    
    }
    
    printf("%d %d",tri,sum-tri);//长方形数量=总子棋盘数-正方形数量

    return 0;
    
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值