本专栏文章都直奔刷题主题,阿辉都不会在废话了,加油,少年!!!
再讲下面两道题前,阿辉先给各位讲一下,对于除和取模阿辉的心得
除(整数除法):
首先提一下进制,各种进制其实只是对于数字的不同表示,对于一个数的十进制、二进制还是八进制都只是这个数的不同表示
那么关于除
,比如:10/ 8 = 1
其实可以理解为对于10的8进制形式的右移一位 10的8进制是12
右移一位刚好是1
怎么理解呢?各种进制是怎么来的,比如8进制,满8就进1
我给你一个8进制数比如127
,这玩意转成十进制怎么转?
是不是:1 × 82 + 2 × 81 + 7 × 80
上面那玩意除8,最低位永远不会到8,整数除法除8不到8直接滚(舍去)
剩下的权重都掉一级 结果就是12
,不就是右移一位嘛
SO除以一个数就是对该数字进制下的右移一位的结果
取模:
有上面的认识,取模就好理解多了,还是8进制数127
1 × 82 + 2 × 81 + 7 × 80这玩意模8得到的就是7,因为取模得到的就是一个数不满8部分,比如10进制的最低位就不满10,16进制的最低位就不满16
SO模上一个数相当于拿到该数进制下的最低位
描述:
在控制台输出所有的“水仙花数”。
水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
举例:153就是一个水仙花数。
153 = 1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 = 153
题不是很难,相信铁子们很容易就想到把个位 十位 百位 上的数字拿到,然后再求立方和判断这个思路吧!阿辉,也是这么想的。
怎么拿到各个位上上的数字很简单:
一个数字模10就可以得到它的十位上的数字,一个数字除以十它十位上的数字就来到了各位然后继续模10得到十位上的数字,百位千位等以此类推
代码很好写:
#include
int main() {
//遍历所有三位数
for(int i = 100; i <= 999; i++){
int a = i % 10; //十位上的数字
int b = (i / 10) % 10;//百位上的数字
int c = (i / 100) % 10;//千位上的数字
if(i == a * a * a + b * b * b + c * c * c)//判断
printf("%d",i);
}
return 0;
}
不过阿辉在看题解的时候总能看到骚操作
水仙花数嘛,不就是个三位数,百位上的数字是1~ 9,个位十位上的数字是0 ~ 9嘛,三个for
循环不会可以表示所有的三位数嘛,然后这么写:
#include
int main(){
for (int i = 1; i < 10; i++) { //i表示百位
for (int j = 0; j < 10; j++) { //j表示十位
for (int k = 0; k < 10; k++) { //k表示个位
if ((i*i*i + j*j*j + k*k*k) == (i*100 + j*10 + k))
printf("%d\n", i * 100 + j * 10 + k);
}
}
}
}
题解真是好东西
描述:
变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,
如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分
后的乘积之和等于自身,则是一个Lily Number
例如:
655 = 6 * 55 + 65 * 5
1461 = 1*461 + 14*61 + 146*1
求出 5位数中的所有 Lily Number。
变种水仙花,主要就是看你对于取模以及除法的理解
把数成功的分成两部分,这道题就做完了
代码如下:
#include
#include
int main(){
for(int i = 10000;i < 100000;i++){
int sum = 0;//sum记录所有分成两部分乘积的和
//因为是5位数所以只有 1 4 2 3 3 2 4 1 这四种分法
for(int j = 4; j > 0; j--){//循环累加
sum += (i / (int)pow(10,j)) * (i % (int)pow(10,j));
}
if(sum == i)
printf("%d ",i);
}
return 0 ;
}