今早无意看群中讨论,一个数能否被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
乘法对应的加法 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,并且这样算出来的结果相对还比较慢。
啦啦:“可以写个单位数据,用循环表示....”
总结一下: 当我们碰到问题时候,要学会发散思维,然后就会发现... (%号它不香吗?天天想些乱七八糟的。。。)。
(╥╯^╰╥)(╥╯^╰╥)(╥╯^╰╥)