#include <bits/stdc++.h>
using namespace std ;
int readInt() ;
int s (int x ) {
if (x == 0) return 1 ;
if (x & 1) {
return s(x - 1) + 1 ;
}
if (x %2 == 0) {
return s(x / 2) ;
}
}
int main ()
{
int x = readInt () ;
printf ("%d\n" , s(x)) ;
return 0 ;
}
int readInt ()
{
int x = 0, f = 1 ;
char c = getchar () ;
while (c > '9' ||c < '0')
{
if (c == '-') f = -1 ;
c= getchar () ;
}
while (c >='0' &&c <='9')
{
x = x * 10 +c - '0';
c = getchar () ;
}
return x *f ;
}
代码解析
int readInt();
这是readInt()
函数的声明,它的定义在main()
函数之后。这个函数用于从标准输入读取整数。
int s(int x) {
if (x == 0) return 1;
if (x & 1) {
return s(x - 1) + 1;
}
if (x % 2 == 0) {
return s(x / 2);
}
}
这是“神秘函数”S(x)的实现,它是一个递归函数:
x
为0,按照定义返回1。x
为奇数(x & 1
检查x
的最低位是否为1),递归调用S(x - 1)
并将结果加1。x
为偶数(x % 2 == 0
检查x
是否被2整除),递归调用S(x / 2)
。代码中的偶数检查有些多余,因为如果x
不是奇数(x & 1
为false),那么它肯定是偶数。
int main() {
int x = readInt();
printf("%d\n", s(x));
return 0;
}
main()
函数中,首先调用readInt()
函数读取整数x
,然后调用s()
函数计算S(x)
的值,并通过printf
将结果打印出来。
int readInt() {
int x = 0, f = 1;
char c = getchar();
while (c > '9' || c < '0') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
这是readInt()
函数的定义,它从标准输入读取连续的字符直到遇到非数字字符停止。该函数能够处理带有负号的整数,并将输入的字符转换为整数值。