一. 知识讲解
1.1 何为进制
进制:是进位计数制,是人为定义的带进位的计数方法。生活中我们最常用的进制是10进制,对应的机制就是逢十进一,而在计算机中我们还会接触到二进制和十六进制,分别对应着逢二进一,逢十六进一的进制机制。
1.2 进制转化
进制转化推荐查看一下文章:
《算法零基础100讲》(第19讲) 进制转换(一) - 入门
二. 相关练习
2.1 二进制中1的个数
题目链接:
剑指 Offer 15. 二进制中1的个数
这道题我们通过辗转相除法将其转化为二进制并统计1的个数
代码如下:
int hammingWeight(uint32_t n) {
int ret = 0;
while(n){
int k = n % 2;
n /= 2;
if(k == 1){
ret++;
}
}
return ret;
}
2.2 各位相加
题目链接:
258. 各位相加
方法一
通过辗转相除法,将其拆分,并将每个数加其来,直到得到各位数。
代码如下:
int addDigits(int num){
int ret = num;
while(ret > 9){
int sum = 0;
num = ret;
while(num){
sum += num % 10;
num /= 10;
}
ret = sum;
}
return ret;
}
方法二
我们通过数学推导,讲任意的数字k写成如下形式:
同时我们令m = ∑ai,则k - m 可以被9整除,而m为余数。
同样的 m 也可以进行这样的分割
以此类推,我们最后可以得到:
代码如下:
int addDigits(int num){
return (num - 1) % 9 + 1;
}
2.3 统计最大组的数目
题目链接:
我们还是用辗转相除的方法对其进行拆分,统计各位数和,同时我们定义一个数组,记录和相同的数字的组数,最后遍历该数组,找到和最大的一组。因为题目给定的数字最大为10000,所以各位数和最大的应该为9999,和为36,所以我们定义一个大于长度36的数组即可。
代码如下:
int countLargestGroup(int n){
int arr[37] = { 0 };
for(int i = 1; i <= n; i++){
int m = 0, k = i;
//拆分统计各位数和
while(k){
m += k % 10;
k /= 10;
}
//统计和为m的数字个数
arr[m]++;
}
int max = 0;
int num = 0;
for(int i = 1; i < 37; i++){
//找到组数最多的一组
if(arr[i] > max){
max = arr[i];
num = 1;
}
else if(arr[i] == max){
num++;
}
}
return num;
}