能否被2整除引发的思考

今早无意看群中讨论,一个数能否被2整除。

小伙伴们纷纷发言:“ 这还不简单吗?,取余 %2 不就分分钟解决了吗!”。

没有问题,回答很正确,我的第一反应也是这样。

然后立刻写上:

#include <iostream>
using namespace std;
int main()
{
	int num = 10;
	if (num%2 == 0)
	{
	   cout << "可以被整除" << endl;
	}
	else
	{
	   cout << "不可以被整除" << endl;
	}
	getchar();
    return 0;
}

然后得出可以被整除,一切看似那么简单,会用%的生活,就是这样朴实无华,且枯燥。(非洲警告)

其实上面代码没有考虑 num 为0 的情况  (╥╯^╰╥);

接下来认识下我们群中两位大佬(思路提供者):

啦啦(群中大佬之一),熟悉各种语言,有独特的想法,很多群友问题都能解决,最主要的群中龙王常驻者。

iny(另一个大佬),问题提出者,对某件事看法想深入了解。

iny: “ 如果不用% ,万一数据很大如何处理。”

啦啦:“那就看最后一位是否为 0 2 4 6 8 ”     ps:其实通过在这句话给我了一点小灵感

然后想到最基本的数学方式:

一个数字要是能被2整除,那么这个数字一定是2的倍数(你这不是废话吗!)

不妨 另 y =2 * n    n \in N

乘法对应的加法  1 * 2 + 2 * 2 +... + m * 2  , 这种形式是不是像及了二进制转十进制。

二进制  1110 等于 2 * 3 + 2 *2 + 2 * 1 + 0 = 14

如果数据是能被2 整除的 其实等价于看最后一位是否是0,便可以得知这个数据是否能被2整除。

在c++ 中有bitset 这个,这样就可以避免用 &运用符来获取最后的数据

下面来看看代码吧!

#include <iostream>
#include <bitset>
using namespace std;


int main()
{
	int num = 10; //不考虑为0的情况
	bitset<8>  getnum(num);
	if (getnum[0] == 0)
	{
		cout << "能被2整除" << endl;
	}
	else
	{
		cout << "不能被2整除" << endl;
	}
	getchar();
    return 0;
}

结果当然是能被2整除.  getnum 的值为 1010. getnum[0] 对应的数据是0,从右往左看 

 

看来这样的方法是可行的(不考虑数据为0,要想考虑的话,请加上判断即可)。

那么又抛出来一个新问题,如果不是2 , 是其他数据呢?

我们知道,计算机通常采用了二进制,八进制,十六进制,十进制。

难到我们只能处理这些数据吗?

下面我们来看一个函数:

errno_t _itoa_s(
   int value,
   char *buffer,
   size_t sizeInCharacters,
   int radix 
);   

ps:由于使用VS2015,就没有使用itoa这个函数,如果你的编译器不支持_itoa_s ,请换成对应的函数。

第一个 为你的数据, 第二个为你的要存储的buffer,第三个为你储存的大小,第四个参数是你想转化的进制。

下面我们来上代码吧:

#include <iostream>
using namespace std;


int main()
{
	int num = 30;
	char data[100]= " \0";
	_itoa_s(num, data,10, 3);
	cout << data << endl;
    return 0;
}

我们发现,num 对应的3进制是 1010  及1* 3^3 + 1 * 3^1 = 30,同时取最后一位数的话,也可以证明是否是3的倍数。

不过第4位的数据不能超过36,第35,对应的是字母z,并且这样算出来的结果相对还比较慢。

啦啦:“可以写个单位数据,用循环表示....”

总结一下:   当我们碰到问题时候,要学会发散思维,然后就会发现...     (%号它不香吗?天天想些乱七八糟的。。。)。

(╥╯^╰╥)(╥╯^╰╥)(╥╯^╰╥)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值