【刷题日志】深度理解除(/)与取模(%)附水仙花数以及变种水仙花数题解

【刷题日志】深度理解除(/)与取模(%)附水仙花数以及变种水仙花数题解_第1张图片

文章目录

  • 前言
  • 除与取模
  • 水仙花数
  • 变种水仙花数

前言

本专栏文章都直奔刷题主题,阿辉都不会在废话了,加油,少年!!!

除与取模

再讲下面两道题前,阿辉先给各位讲一下,对于除和取模阿辉的心得
(整数除法):
首先提一下进制,各种进制其实只是对于数字的不同表示,对于一个数的十进制、二进制还是八进制都只是这个数的不同表示
那么关于,比如: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 ;
}

请添加图片描述

你可能感兴趣的:(阿辉的的刷题日志,c语言,c++,算法)