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

day01

一、选择题

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

int main()
{
	char a = 101;
	int sum = 200;
	a += 27; sum += a;
	printf("%d\n", sum);
}

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);

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));
}

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 <stdio.h>
void func(char *p) 
{ p = p + 1; }
int main()
{
char s[] = {'1', '2', '3', '4'};
func(s);
printf("%c", *s);
return 0;
}

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 <stdio.h>
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;
}

 
 

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

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

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

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

C++

#include<iostream>
#include<cmath>
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;
}

C

#include<stdio.h>
#include<math.h>
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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hey pear!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值