#B3. 函数与位运算题解

函数与位运算题解

A1150 求正整数2和n之间的完全数

题意

完全数的定义:真因子之和等于本身的正整数。

求正整数2和n之间的完全数(一行一个数)。

完全数:因子之和等于它本身的自然数,如6=1+2+3

题解

编写函数,求当前数是否为完全数。

遍历2-n,如果当前数是完全数,则ans++。

A1151 素数个数

题意

编程求2~n(n为大于2的正整数)中有多少个素数。

题解

编写函数,求当前数是否为素数。

遍历2-n,如果当前数是素数,则ans++。

A1155 回文三位数

题意

如果一个数从左边读和从右边读都是同一个数,就称为回文数。例如6886就是一个回文数,求出所有的既是回文数又是素数的三位数。

题解

编写函数,求当前数是否为素数。

编写函数,求当前数是否为回文数。

遍历100-999,如果当前数是素数和回文数,则输出。

A1157 哥德巴赫猜想

题意

哥德巴赫猜想的命题之一是:大于6 的偶数等于两个素数之和。编程将6~100所有偶数表示成两个素数之和。

题解

编写函数,求当前数是否为素数。

遍历6-100之间的偶数,拆成两个数,判断这两个数是不是素数,是则输出。

P8072 [COCI2009-2010#7] COKOLADA

题意

需要巧克力大小为K,只能购买2的幂的巧克力,切割也只能对半切,问需购买巧克力大小的最小值和最小切割次数。

题解

需购买巧克力大小的最小值为2xK2^x\geq K。最小切割次数为xK的二进制末尾0的个数x-K的二进制末尾0的个数,即K的二进制从最高位的1到最低位的1总共的位数K的二进制从最高位的1到最低位的1总共的位数

P1100 高低位交换

题意

二进制数的前16 位为“高位”,后16 位为“低位”。输出高低位交换后的数。

题解

方法1:位运算求解。

unsigned int n;
cout << (n >> 16) | (n << 16);

方法2:指针求解。注意存储方式为小端字节序,因此二进制数的高字节存放到内存的高地址,即假设前16位存放在A地址,则后16位存放在A-1地址。所以指针指向该二进制数,是指向后16位。

unsigned int s;
cin >> s;
unsigned short *p = (unsigned short *)&s;
unsigned int n = (*p) << 16;
p++;
n += (*p);
cout << n;