06.2 操作符、函数习题

2024-04-07 13:18
文章标签 函数 习题 操作符 06.2

本文主要是介绍06.2 操作符、函数习题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一题

以下代码的输出结果

int main() {int arr[] = {1, 2, 3, 4, 5};short *p = (short *) arr;for (int i = 0; i < 4; i++) {*(p + i) = 0;}for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);}return 0;
}

image-20220104004117392

解析:这里的重难点就是short *p = (short *) arr;因为short只有2字节,所以他每次只能操作两个字节的地址。这样的话第一个for循环就可以将两个int的内容变为0。输出的时候就前两个值为0后面的不变。

第二题

以下代码的输出结果

int main() {int a = 0x11223344;char *pc = (char*)&a;*pc = 0;printf("%x \n",a);//十六进制的输出形式return 0;
}

image-20220104004852646

解析:0x11223344在内存中存储内容是44332211,char* 每次只能操作一个字节的内容。所以44->0,输出的时候再逆序输出就是11223300。

第三题

以下代码的输出结果

int i;
int main() {i--;if(i> sizeof(i)){printf("> \n");} else{printf("<\n");}return 0;
}

image-20220104005537888

解析:全局变量没有初始化的时候默认是0;

sizeof()计算变量/变量所占内存的大小。大小>=0,是无符号数。

当无符号数与正常数字进行比较时先将正常数转化为无符号数。-1转化为无符号数是一个很大的值。所以结果就是 “>”。

第四题

以下代码的输出结果

int main() {int a=0,b=0,c=0;a = 5;c = ++a;b = ++c,c++,++a,a++;b += a++ + c;printf("a = %d b = %d c = %d\n",a,b,c);return 0;
}

image-20220104011710562

解析:"=“的优先级高于”,",1. a = 5;c = 6;c = 7;b = 7;c = 8;a = 6;a = 7; “+“的优先级高于”=” 2. 计算b += a++ + c; -> a = 8, c = 8 b = 7->>b = 23

第五题

统计一个数二级制中1的个数

写一个函数返回参数二级制中1的个数。

方法一:
int Count_1(unsigned int n) {int count = 0;while (n) {if (n % 2 == 1) {count++;}n = n / 2;}return count;
}int main() {int n = 0;scanf("%d", &n);//函数  a的二级制补码中的1的个数int count = Count_1(n);printf("count = %d", count);return 0;
}

解析:计算二进制为1的位数时每次对2取余就是获取最后一位的数字。除以二就是将这个数最后一位删去。对于负数只需要将其按照无符号数来对待就可以了。

方法二:
int Count_1( int n) {int count = 0;for(int i = 0;i<32;i++){if(((n>>i)&1)==1){count++;}}return count;
}

解析:使用移位的方式,和位计算且的原理,只要和1与运算的结果为一说明当前数的最后一位为1,每次多移一位进行运算。出现1count+1。32次运算,结果就是答案。

方法三:
int Count_1( int n) {int count = 0;while(n){n = n&(n-1);count++;}return count;
}

解析:一个数的二进制可以通过(n)&(n-1)将n最右边的1消除掉。这样计算时间复杂度是最低的。

第六题

题目:求二进制中不同位的个数

内容: 两个int(32位)整数m和n的二进制表达式中,有多少个位(bit)不同。

int Count_1( int n) {int count = 0;while(n){n = n&(n-1);count++;}return count;
}
int GetDiff(int m,int n){int count=0;count = Count_1(m^n);return count;
}
int main(){int m=0,n=0;scanf("%d %d",&m,&n);int count = GetDiff(m,n);printf("count=%d",count);return 0;
}

解析:先将两数进行异或计算。这样不相同的位数就可以由异或后的值进行表达,然后再将此值进行位为1的个数统计。

第七题

题目:打印二进制的奇数位和偶数位(从低位往高位数)

获取一个整数的二进制序列中所有的偶数位和奇数位,分别打印出二进制序列。

void Print(int m){for (int i = 30; i >= 0; i-=2) {printf("%d",(m>>i)&1);}printf("\n");for (int i = 31; i >= 0; i-=2) {printf("%d",(m>>i)&1);}
}
int main(){int m = 0;scanf("%d",&m);Print(m);return 0;
}

解析:从最高位开始右移每次只要最后一位。通过奇数位偶数位的控制进行打印。

第八题

题目:交换两个变量(不创建临时变量)

方法一 思路 (加减法可能会溢出)

image-20211231120741442

代码实现

int a = 2;
int b = 3;
a = a+b;
b = a-b;
a = a-b;

方法二 (思路) 一个数对同一个数两次异或回到本身。而且异或运算有交换律

image-20211231122117758

代码实现

int a = 2;
int b = 3;
a = a^b;
b = a^b;
a = a^b;
printf("%d  ",a);
printf("%d  ",b);

image-20211231123937838

函数传参

第一题

字符串逆序(递归实现)

编写一个函数reverse_string(char* string)。

非递归:

void reverse_string(char* arr,int sz){int left= 0;int right = sz-2;int temp;while (left<right){temp = arr[left];arr[left] = arr[right];arr[right] = temp;left++;right--;}
}
int main(){char arr[] = "abcdef";int sz = sizeof(arr)/ sizeof(arr[0]);// printf("%d",sz);reverse_string(arr,sz);printf("%s",arr);
}

递归:

int my_strlen(char *str) {char *start = str;char *end = str;while (*end != '\0') {end++;}return (int)(end - start);
}
void reverse_string(char arr[]) {char temp = arr[0];int len = my_strlen(arr);arr[0] = arr[len - 1];arr[len - 1] = '\0';if (my_strlen(arr + 1) >= 2)reverse_string(arr + 1);arr[len - 1] = temp;
}
int main() {char arr[] = "abcdefg";printf("%d\n", my_strlen(arr));reverse_string(arr);printf("%s\n", arr);return 0;
}

解析:问题分解。交换最外层的两个值,当当前字符串长度大于等于2时递归。

实现步骤:1.将数组第一个值传给临时变量temp,将最后一个值传给第一个值。2.将最后一个位置先修改为’\0’用来表示字符串暂时结束。3.将数组下标从第二个开始reverse_string()。4.递归完之后将临时变量的值传给最后一个位置。

第二题

计算一个数的每位之和(递归实现)

写一个递归函数DigitSum(a),输入一个非负整数,返回组成他的数字之和。

int DigitSum(unsigned int num){if(num/10 == 0){return num;}return num % 10 +DigitSum(num/10);
}int main(){unsigned int num = 0;scanf("%d",&num);int res = DigitSum(num);printf("res = %d",res);return 0;
}

解析:终止条件就剩下一位数的的时候。举例1234的每位之和等于4+123的每位之和。

第三题

递归实现n的k次方

double Pow(int n,int k){if (k==0) return 1;else if (k>0) return n* Pow(n,k-1);else return (1.0/n)* Pow(n,k+1);
}int main(){int n = 2;int k = -3;double res = Pow(n,k);printf("res = %lf \n",res);return 0;
}

解析:Pow(n,k) = n * Pow(n,k-1)。终止条件,k == 0的时候等于1。

第四题

计算斐波那契数列(递归实现)

int Fib(int first,int second,int n){    //---->>>需要修改参数的量if (n<=2) return 1;if (n==3) return first+second;else return Fib(second,first+second,n-1);
}
int main(){int n;scanf("%d",&n);int res = Fib(1,1,n);printf("%d",res);return 0;
}

解析:经过优化的斐波那契数列。
w(n,k-1)。终止条件,k == 0的时候等于1。

第四题

计算斐波那契数列(递归实现)

int Fib(int first,int second,int n){    //---->>>需要修改参数的量if (n<=2) return 1;if (n==3) return first+second;else return Fib(second,first+second,n-1);
}
int main(){int n;scanf("%d",&n);int res = Fib(1,1,n);printf("%d",res);return 0;
}

解析:经过优化的斐波那契数列。

这篇关于06.2 操作符、函数习题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882696

相关文章

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

Kotlin运算符重载函数及作用场景

《Kotlin运算符重载函数及作用场景》在Kotlin里,运算符重载函数允许为自定义类型重新定义现有的运算符(如+-…)行为,从而让自定义类型能像内置类型那样使用运算符,本文给大家介绍Kotlin运算... 目录基本语法作用场景类对象数据类型接口注意事项在 Kotlin 里,运算符重载函数允许为自定义类型重

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中