1.1介绍
之前做了几道面试题,其中有两道类似的,都是求某进制各位数之和,因此写了一个递归函数,觉得比较好用特地再次记录一下。
1.2第一题
1,题目描述
2,解析
(1)下面的Data函数的参数为(10进制数num,要求转换的进制n,sum的初始值num%n),返回值为num转换成n进制后的各位数之和sum,如5转换成2进制为101,返回各位数之和为sum=1+0+1=2;5转换成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,要求转换的进制n,sum的初始值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);
}
}