选择题
C/C++中各种进制的表示方法
二进制:在数字的末尾加b,如101010b
八进制:在数字前面加数字0,如0123
十进制:数字本身,如123
十六进制:数字前面加0x 或者 数字后面加h,如0x123、123h
对应输出格式:
%d
:十进制方式输出
%o
:八进制方式输出
%x
:十六进制方式输出
所以显而易见,题目所给两个数分别是8进制和10进制,十进制123转化为8进制为173,所以选择C
题目要求把flag的第二个bit位置为0
置位一般使用0和&,复位一般使用1和&
那么与flag运算的数的第二个bit位应该是0,而2的二进制位0000 0010
,显然把2按位取反,就满足,除了第二个bit位为0,其他位都是1,与flag做与运算,只会把flag的第2个bit位置为0,其他位保持不变
所以选择A
const在 * 之后
:const修饰的是指针,是一个指针常量,指针不能被改变,指针指向的内容可以改变,如int* const p
const在*之后
:const修饰的指针指向的内容,是一个常量指针,指针可以改变,指针指向的内容不可以改变,如const int* p
或者int const* p
题目描述为一个指针常量,所以答案选择B
a的类型是
int*
&a的类型是int(*)[5]
所以,*(a+1)
得到的为3,*(p-1)
得到的为9,答案选C
所以在func中,m指向"morning",m++之后,m指向"afternoon"
而m是char**类型,解引用得到char类型,char类型输出的时候是输出字符串,所以得到 “afternoon”,答案选择A
x&(x-1)
的作用是:消去二进制中最右边的一个1
所以该语句配合count++的作用就是 统计二进制1的个数
9999转化为二进制为:10 0111 0000 11 11 一共8个1 所以选A
结构体A:
int: 0 1 2 3 short: 4 5 空6 7 int: 8 9 10 11 char:12 一共13字节,对齐后:16字节
结构体B:
int: 0 1 2 3 short: 4 5 char: 6 空7 int: 8 9 10 11 共12字节,已对齐
所以答案为 C
编程题
1. 计算糖果
1. 枚举 + 反向带入验证
#include<iostream>
using namespace std;
int main()
{
int AsubB,BsubC,AaddB,BaddC;
cin>>AsubB>>BsubC>>AaddB>>BaddC;
//计算出A B C
int A = (AsubB + AaddB)/2;
int B = (BsubC + BaddC)/2;
int C = (BaddC - BsubC)/2;
//此时算出的A B C 可能是截断之后的数!
//所以重新带入计算
if(AsubB == A - B
&& BsubC == B - C
&& AaddB == A + B
&& BaddC == B + C)
{
cout << A <<" "<<B<<" "<<C<<endl;
}
else
{
cout<<"No"<<endl;
}
return 0;
}
2. 两个方法算出的B相同
因为,只有一组A B C 满足条件,如果满足条件,那么两种方法计算出来的B一定相同,否则不相同
#include<iostream>
using namespace std;
int main()
{
int AsubB,BsubC,AaddB,BaddC;
cin>>AsubB>>BsubC>>AaddB>>BaddC;
//计算出A B C
int A = (AsubB + AaddB)/2;
int B1 = (BsubC + BaddC)/2;
int B2 = (AaddB - AsubB)/2;
int C = (BaddC - BsubC)/2;
if(B1 == B2)
{
cout << A <<" "<<B1<<" "<<C<<endl;
}
else
{
cout <<"No"<<endl;
}
return 0;
}
2. 进制转换
思路很简单
- M%N得到余数,放入栈中
- M/=N,进入下一次循环,直到M为0
- 依次把栈中的字符拼接到结果字符串的后面
注意:
- 如果M为0,那么str为空,因为一个循环都不会进入,不需要单独处理
- 如果M为负数,该题说明了,如果M为负数,直接在最终结果的前面加一个负号即可!
- 如果该题改为ACM代码模式则无法返回,要直接输出结果,要注意,需要单独处理一下M为0的情况,什么都不会输出,但是容易会处理为有一个cout<<endl,这时候有一行空格 所以就无法ac!容易卡在这里! 综合考虑,好习惯是上来就把最特殊情况考虑在内!
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 进制转换
* @param M int整型 给定整数
* @param N int整型 转换到的进制
* @return string字符串
*/
string solve(int M, int N) {
// write code here
stack<char> st;
string str;
int flag=1; //记录M正负
cin>>M>>N;
//如果M为负数,先换成整数!
if(M<0)
{
M*=-1;
flag = -1;
}
while(M>0)
{
int mod = M%N;
M/=N;
char ch;
if(mod<10)
{
ch = mod + '0';
}
else
{
ch = mod-10+'A';
}
//入栈
st.push(ch);
}
//如果M为负数,先输出符号
if(flag==-1)
{
str+="-";
}
while(!st.empty())
{
str += st.top();
st.pop();
}
return str;
}
};