两道面试题——进制各位数之和

1.1介绍

之前做了几道面试题,其中有两道类似的,都是求某进制各位数之和,因此写了一个递归函数,觉得比较好用特地再次记录一下。

1.2第一题

  1,题目描述


  2,解析

(1)下面的Data函数的参数为(10进制数num,要求转换的进制nsum的初始值num%n),返回值为num转换成n进制后的各位数之和sum,如5转换成2进制为101,返回各位数之和为sum=1+0+1=25转换成3进制12,各位数之和为sum=1+2=3.

原理比较简单,十进制如何进位的,其他进制就是如何进位的,某一位大于进制数就递归该函数,小于就返回值。

2)源码:

#include<iostream>
using namespace std;
//该函数比较重要
int Data(int num,int n,int sum)
{
    int count;
    count=num/n;
    if(count<n){
         sum+=count;
        return sum;
    }
    else{
        return sum+Data(count,n,count%n);
    }
}
int main ()
{
    int i,j,k;//循环用
    int mt,nt,m,n,r;//约分用
    int arry;//十进制数
    int vlaue;//最终和
    cin>>arry;
    vlaue=0;
    for(j=2;j<=arry-1;j++){
        vlaue+=Data(arry,j,arry%j);
    }
    //约分
    m=vlaue;
    n=arry-2;
    r=n%m;
    while(r!=0)
    {
        n=m;
        m=r;
        r=n%m;
    }
    mt=vlaue/m,nt=arry-2/m;
    cout<<mt<<"/"<<nt;
    return 0;
}

1.3第二题

  1,题目描述



  2,解析

(1)如果上一题明白,这一题就无须解释了

(2)源码:

#include<iostream>
using namespace std;
int Data(int num,int n,int sum)
{
    int count;
    count=num/n;
    if(count<n){
         sum+=count;
        return sum;
    }
    else{
        return sum+Data(count,n,count%n);
    }
}
int main(){
    int n,vlaue=0,he1,he2;
    int i,j;
    cin>>n;
    for(i=1;i<=n;i++){
        he1=Data(i,10,i%10);
        he2=Data(i,2,i%2);
        if(he1==he2){
            vlaue++;
        }
    }
    cout<<vlaue;
    return 0;
}

1.4总结

这段代码就直接拿来用来,比较简单。参数为(10进制数num,要求转换的进制nsum的初始值num%n)。


int Data(int num,int n,int sum)
{
    int count;
    count=num/n;
    if(count<n){
         sum+=count;
        return sum;
    }
    else{
        return sum+Data(count,n,count%n);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值