选择题
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; }