【C与数据结构】——寒假提高每日练习Day1

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【C与数据结构】——寒假提高每日练习Day1

选择题

1、以下代码会输出什么?


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


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


答案:->答案为D


解析:a为char类型,大小为1个字节,8个比特位,所对应的补码为0110 0101 当它加上27后对应的补码为:1000 0000 然后与sum进行运算时会发生整型提升,对于无符号类型来说,整型提升高位补符号位,但是a同时也是char类型,最高位为1,所以这里将1看作符号位,整型提升后为1111 1111 11111111 11111111 10000000,然后补码取反+1得到原码:10000000 00000000 00000000 10000000 即-128,所以变成了200-128=72,答案为D


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


答案:->D


解析:这里1024的补码为00000000 00000000 00000100 00000000 ,而condition强制转换为char后,只有8个比特位,即00000000 也就是0,C语言中0为假,所以if语句不执行,最终结果为1024 0 答案为D


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     D100,100


答案:->B


解析:sizeof(数组名)这里表示的是整个数组,para为char类型,共100个元素,所以大小为100byte,而p是个指针,在32位机器中,指针的大小固定位4byte,所以选B


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、无法确定


答案:->C


解析:形参的改变不会影响实参,这里*p确实等于2,但是与s无关,s作为数组名表示数组首元素,解引用后即1,所以选C


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


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


答案:C、D


解析:考点为作为形参如何接收二维数组的传参,对于二维数组的传参,形参共以下几种方式用来接收:1、与它本身保持一致 int D[ 4 ] [ 8 ]    2、可以省略行,但是不能省略列  int [  ] [ 8 ]   3、数组指针  int (*s)[ 8 ]  故选C、D


编程题

自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n(包括n)以内的自守数的个数


数据范围:1≤n≤10000


例:


输入:


6

输出:


4

说明:


有0,1,5,6这四个自守数

方法一:


思路:找规律后发现,(自守数的平方数-自守数后)再%(10^(位数))==0,就比如25^2=625,这里(625-25)%100 ==0 ,利用该特性解题


代码实现:


#include <stdio.h>
#include<math.h>
int main() {
    int n=0;
    scanf("%d",&n);
    int count=0;//计数
    //从0遍历
    for(int i=0; i<=n; i++)
    {
        int count_=0;//用来统计位数
        int m=i;
        while(m)
        {
            m/=10;
            count_++;
        }
        int tmp=(int)pow(i,2);
        //平方后的数-该数后再%10^count_ == 0 
        if((tmp-i) % ((int)pow(10,count_)) ==0 )
        {
            count++;
        }
    }
    printf("%d",count);
}


方法二:


遍历0-n,将这个数的每一位都与它的平方数的每一位从个位数进行对比,借助flag变量解题。


代码实现:


#include <stdio.h>
#include<math.h>
int main() {
    int n=0;
    int count=0;
    scanf("%d ",&n);
    for(int i=0; i<=n; i++)
    {
        int flag=0;
        int tmp=(int)pow(i,2);
        int s=i;//s记录i
        //将s的每一位与tmp的每一位进行比较
        while(s)
        {
            int cur=s%10;
            int p=tmp%10;
            s/=10;
            tmp/=10;
            //不相等的话flag=1,退出循环
            if(cur != p)
            {
                flag=1;
                break;
            }
        }
        //如果等于0,说明每一位都相等,即i为自守数,count++
        if(flag == 0)
        {
            count++;
        }
    }
    printf("%d",count);
}


两种方法都可以实现该题,时间复杂度都为O(N)


题目二:


输入描述:

一个整数N


输出描述:

小于N的质数数量(请考虑性能)


例:


输入:


10

输出:


4

说明:


N=10,质数有 [2, 3, 5, 7]

思路:对于该题,转换为求2-N之间的素数个数(0、1不为质数),这里最容易想到的就是试除法,即将一个数从2-N进行试除,如果都不能被整除,就说明是质数,count计数++,但是这里题目要求优化性能,即我们可以试除到该数的平方根即可,就比如100,完全没必要进行2-100的试除,只需要试除2-10即可。


代码实现:


#include <stdio.h>
#include<math.h>
//转化为求2-n之间的质数个数
void PrimeCount(int n,int p)
{
    for(int i=2; i<n; i++)
    {
        int flag=0;
        //试除[2,sqrt(n)]
        for(int j=2; j<=sqrt(i); j++)
        {
            if(i % j ==0)
            {
                flag=1;
                break;
            }
        }
        if(flag == 0)
        {
            p++;
        }
    }
    printf("%d",p);
}
int main() {
    int n=0;
    scanf("%d",&n);
    int count=0;
    PrimeCount(n,count);
    return 0;
}



相关文章
|
存储 C语言
万字精讲——数据结构栈与队列必会OJ练习
万字精讲——数据结构栈与队列必会OJ练习
48 0
|
5月前
|
存储 算法 数据安全/隐私保护
【Python学习篇】Python实验小练习——高级数据结构(五)
【Python学习篇】Python实验小练习——高级数据结构(五)
68 1
|
6月前
|
存储 算法 C语言
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
|
存储 C语言
【数据结构】栈和队列&&OJ练习
栈和队列的实现及其OJ练习
|
6月前
|
存储 缓存 索引
【数据结构入门精讲 | 第十四篇】散列表知识点及考研408、企业面试练习(1)
【数据结构入门精讲 | 第十四篇】散列表知识点及考研408、企业面试练习(1)
96 0
|
6月前
|
定位技术 调度
【数据结构入门精讲 | 第十九篇】考研408、企业面试图专项练习(二)
【数据结构入门精讲 | 第十九篇】考研408、企业面试图专项练习(二)
97 0
|
6月前
|
存储 算法
【数据结构入门精讲 | 第十八篇】考研408、企业面试图专项练习(一)
【数据结构入门精讲 | 第十八篇】考研408、企业面试图专项练习(一)
57 0
|
6月前
|
算法 计算机视觉
【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习
【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习
85 0
|
6月前
|
自然语言处理 数据安全/隐私保护
【数据结构入门精讲 | 第十五篇】散列表知识点及考研408、企业面试练习(2)
【数据结构入门精讲 | 第十五篇】散列表知识点及考研408、企业面试练习(2)
53 0
|
6月前
|
人工智能 算法
【数据结构入门精讲 | 第十三篇】考研408、公司面试树专项练习(二)
【数据结构入门精讲 | 第十三篇】考研408、公司面试树专项练习(二)
90 0