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

请添加图片描述

文章目录

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

🚀前言

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

🚀除与取模

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

请添加图片描述

  • 92
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 85
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 85
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿辉不一般

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值