• 暑期刷题不松懈——C/C++(1)


    day01

    一、选择题

    1、如下代码输出的是什么( )

    int main()
    {
    	char a = 101;
    	int sum = 200;
    	a += 27; sum += a;
    	printf("%d\n", sum);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    A: 327 B: 99 C: 328 D: 72

    解析:
    为什么不是328而是72呢?
    因为a是char,sum是int,两个类型不同的数要做运算时,会发生整型提升。
    101
    01100101
    整型提升后高位补0
    原码 --> 符号位不变其他位按位取反得到反码 --> 反码+1得到补码
    正数原反补相同
    00000000 00000000 00000000 01100101 原码
    200
    11001000
    27
    00011011

    a+ = 27
    128
    但是取值范围是-128~127 128超过了这个范围
    10000000高位是1(负数),计算机存储的就是-128
    所以在下一步sum+=a;
    200-128=72

     

    2、对于下面代码执行后输出的是什么( )

    int value = 1024;
    char condition = *((char*)(&value));
    if(condition) value += 1; condition = *((char*)(&value));
    if(condition) value += 1; condition = *((char*)(&value));
    printf("%d %d", value, condition);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    A: 1026 1 B: 1025 0 C: 1025 1 D: 1024 0

    解析:
    将1024化成十六进制为:0x0400
     
    题中&value取地址相当于取首地址(低地址)
     
    若数据是采用大端存储方式,则低地址对应的是数据的高位,即最左边的0.
    则condition = 0,不执行两个if语句,则value不变,还是1024,
     
    若数据是采用小端存储方式,则低地址对应的是数据的地位,即最右边的0.
    则condition = 0,不执行两个if语句,value值还是1024.

    大端字节序存储:
    指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中

    0x 04 00
    低 高
     
    小端字节序存储:
    指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中
    00 04 0x
    低 高

     

    3、假设在32位机器上,读代码选结果( )

    void func(char para[100])
    {
    void *p = malloc(100);
    printf("%d, %d\n", sizeof(para), sizeof(p));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    A: 4,4 B: 100,4 C: 4,100 D: 100,100

    解析:
    通常情况下,我们说的数组名都是数组首元素的地址
    sizeof(数组名),这里的数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小
    sizeof(指针) 得到的是 计算机系统的地址字节数,返回4(一般是4 or 8但题目说了在32位机器上所以是4)
    如果这样的话,那么sizeof(para)应该是100,而不是4,但这里是C语言的bug,数组在有些条件下会隐式转变成指针 因为para数组前面是char,所以是依旧是4

     

    4、以下程序执行后的输出结果为( )

    #include 
    void func(char *p) 
    { p = p + 1; }
    int main()
    {
    char s[] = {'1', '2', '3', '4'};
    func(s);
    printf("%c", *s);
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    A: 2 B: 编译错误 C: 1 D: 无法确定

    解析:
    s使用指针访问值
    这里访问的是数组第一个元素的值
    因为func函数中运算的不是指针,就不进行运算
    如果是
    p = *p+1;那么打印出的值就是2

     

    5、已知数组D的定义是 int D[4][8]; 现在需要把这个数组作为实参传递给一个函数进行处理。下列可以作为对应的形参变量说明的是【多选】( )

    A: int D[4][] B: int *s[8] C: int(*s)[8] D: int D[][8]

    解析:
    二维数组可以省略前一个数
    int* s[8] s是数组
    int (*s)[8] s是一个指向数组的指针
    所以AB都是错误写法

     
     

    二、编程题

    1、自守数是指一个数的平方的尾数等于该数自身的自然数。请求出n(包括n)以内的自守数的个数

    自守数——牛客刷题

    例如: 25^2 = 625 , 76^2 = 5776 , 9376^2 = 87909376 。
    输入描述:int型整数
    输出描述:n以内自守数的数量。

    实例:
    输入:5
    2000
    输出:3
    8
    说明:对于样例一,有0,1,5,这三个自守数

    #include 
    int main()
    {
        int n = 0;
        while(scanf("%d",&n)!=EOF)//多组输入
        {
            int k,s = 0;
            for(int i=2;i<n;i++)
            {
                s = i*i;//平方
                if(s%10==i||s%100==i||s%1000==i||s%10000==i)
                //如果只要有个位十位百位千位其中一个相等,因为求的是尾数
                {
                    k++;            
                }        
            }
            printf("%d\n",k);    
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

     
     

    2、返回小于 N 的质数个数

    返回小于N的质数个数——牛客

    输入描述:一个整数N
    输出描述:小于N的质数数量
    备注:0、1 不属于质数。

    示例:
    输入:10
    输出:4
    说明:N=10,质数有 [2, 3, 5, 7]

    C++

    #include
    #include
    using namespace std;
    
    int main()
    {
    	int n = 0;
    	int ret = 0;
    	cin >> n;
    	for (int i = 2; i <= n; i++)
    	{
    		int flag = 0;
    		for (int j = 2; j <= sqrt(i); j++)
    		{
    			if (i%j == 0)
    			{
    				flag = 1;
    				break;
    			}
    		}
    		if (flag == 0)
    		{
    			ret++;
    		}
    	}
    	cout << ret << endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    C

    #include
    #include
    int main()
    {
        int N=0,count=0,i,j;
        scanf("%d",&N);
        for(i=2;i<=N;i++)
        {
            int k=i;
            for(j=2;j<=sqrt(k);j++)
            {
                if(k%j==0)
                    break;
            }
            if(j>sqrt(k))
            {
                count++;
            }
        }
        printf("%d\n",count);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    卡特兰数和算法
    BFS:845. 八数码
    【每日一题Day33】LC799香槟塔 | 动态规划
    java-php-python-ssm养老机构系统计算机毕业设计
    web前端——VUE
    【达梦数据库】mysql函数改写达梦
    一款实用的.NET Core加密解密工具类库
    JVM类加载机制
    JAVA集合,HashSet 自定义判重规则
    105.从前序与中序遍历序列构造二叉树
  • 原文地址:https://blog.csdn.net/Ll_R_lL/article/details/125854528