1.题1
#include<stdio.h>
int main()
{
unsigned char i = 7;
int j = 0;
for(;i > 0;i -= 3)
{
++j;
}
printf("%d\n", j);
return 0;
}
上述代码的运行结果是什么呢?
我们来分析一下:for循环中没有初始化,但是在上述中i完成初始化了,我们发现j是用来计算循环的次数的,有人会想7-3=4,4-3=1,1-3=-2,这样的话就不满足判断条件i>0,这样不就停下来啦,所以结果j应该等于3,但是这样的想的小伙伴是不是忘记了一个条件那就是i是无符号的char,所以不存在负数,只有一种可能使for循环停下来,那就是i=0时可以,那现在很明确了我们只需要求得i在第一次等于0时循环的次数即可,刚开始为-2时其实1数值为254,然后不断减3为2,再减3为-1,其实为255,再不断减3为0,总共有173次,那到底对不对呢?
运行看看:
2.题2
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 数据范围:两个数都满足 0≤n≤1000
int Add(int num1, int num2 ) {
while(num2 != 0) {//进位不为0则持续与相加结果进行相加
int tmp = num1 ^ num2;//得到每位相加不考虑进位的数据
num2 = (num1 & num2) << 1;//同1的位相加则会进位
num1 = tmp;
}
return num1;
}
3.题3
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
int majorityElement(int* nums, int numsSize){
int count = 1;
int tmp = nums[0];
for (int i = 1; i < numsSize; i++) {
if (tmp == nums[i]){//与保存的字符相同则计数+1
count++;
} else {//与保存的字符不同则计数-1
count--;
//计数为0表示有可能保存的字符不是最多的字符,换下一个
if (count == 0) tmp = nums[i + 1];
}
}
return tmp;
4.题4
给定两个数组,编写一个函数来计算它们的交集。
示例: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
static int arr[1000];
*returnSize = 0;
int i, j, k;
for (i = 0; i < nums1Size; i++) {
for (j = 0; j < nums2Size; j++) {
if (nums2[j] == nums1[i]) break;//判断nums1[i] 是否在nums2数组中
}
if (j == nums2Size) {// nums1中i位置的数据在nums2数组中不存在,则非交集数据
continue;
}
//只有在另一个数组中存在的数据才能走下来,判断是否已经被添加到返回数组中
for (j = 0; j < *returnSize; j++) {
if (nums1[i] == arr[j]) break;//判断nums1[i] 是否在 arr 这个返回数组中
}
if (j == *returnSize) {//不在返回数组中,则添加到返回数组中
arr[*returnSize] = nums1[i];
*returnSize += 1;
}
}
return arr;
}
5.题5
输入一个字符串和一个整数 k ,截取字符串的前k个字符并输出 输入描述:
1.输入待截取的字符串
2.输入一个正整数k,代表截取的长度
#include <stdio.h>
int main()
{
char str[101];
while(scanf("%s", str) > 0) {
int n;
scanf("%d", &n);
str[n] = '\0';
printf("%s\n", str);
}
return 0;
}
c语言经典测试题在这里就是最后一篇了,大家学到多少了呢?会不会对c语言有了更多的认识了呢?接下来就是开始更新c++相关的博客了。和大家一起努力很开心,哈哈。