欢迎来到我的:世界
希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !
目录
- 前言
- 填空题:
- 第一题
- 第二题
- 第三题
- 编程题:
- 第一题:不用加减乘除做加法
- 第二题:完全数计算
- 第三题:单词倒排
- 总结
前言
今天是学校开学的第一天😊,真是个特殊的日子,步入写博客已经不知不觉有6个月了,我能感受写博客越来越从容了,那就让我俯视这我所热爱的一切。😎
填空题:
第一题
请问下列程序输出的结果是什么?
思路:无符号位char类型范围是:0~255
所以这题就是让我们寻找等于0的时候;
知道-2
是11111110
变成254
;同理-1
是11111111
变成255
,最后减到0的时候就跳出循环,不满足就继续循环;
7 4 1 -2 == > 共(7-1)/3+1=3次(1- 3 = -2,即254,继续循环)
254 251…5 2 -1 == > 共(254-2)/3+1=85次(2- 3 = -1 ,即255,继续循环 )
255 252…6 3 0 == > 共(255-5)/3+1=85次(3-3=0,退出循环)
所以一共循环了: 85+85+3=173次
第二题
请问下列程序输出的结果是什么?
思路:
这道题考察的是:隐式类型转换
x是有符号数-1,内存中是全1,当有符号的x和无符号数进行比较时,x会隐式类型转换被当做无符号数,是一个很大的数,所以会进入(x > y),且打印出:x is greater
第三题
思路:
我们首先要知道
x|(x + 1)
意味着什么?
假设x=3
就是011
,那么x+1=4
就是100
;按照按位或|
的运算原则:有1
则为1
,两者都为0
,则为0
;所以知道x|(x+1)
为111
,从右往左数第一个0
变成了1
;
总结:x|(x+1)
,作用是每次循环把x的二进制中从右往左数的最后一位0变成1;
当x
所有二进制位的都变成了1
,那x+1
就会溢出为0
,循环结束;
而2014
的二进制序列是:0000 0000 000 0000 0000 0111 1101 1110
,所以应该为23;
编程题:
第一题:不用加减乘除做加法
地址:oj地址
解题思路:
这道题考察的是:加法的运算原理
肯定要根据利用数据的二进制位来实现,那就需要运用了按位与&
和按位异或^
;
首先知道&
的运算原则:有0
则为0
,两者都为1
,则为1
;
^
的运算原则:相同则为0
,相异则为1
;
如果用他们的二进制来计算:
假如不需要进位,则直接就可以得到答案:
如5
为101
,2
为010
,不需要进位,则101 ^ 010
等于111
为7
;
假如需要进位,则需要&
找出需要进位值再进行<<1
进位;
假设两个值3
和2
,二进制分别为011
和010
,结果应该为5
,即101
,那就来看二进制011 & 010
,就可以找到需要进位的二进制位,再<<1
,代表进1位;知道了
&
的运算原则,那肯定可以用来进位的时候用;
代码实现:
int Add(int num1, int num2 ) {// write code hereint tem=num1;while(num2){tem=num1^num2;//不考虑进位num2=(num1&num2)<<1;//考虑进位num1=tem;}return tem;
}
第二题:完全数计算
地址:oj地址
解题思路:
思路:可以看出要为完全数,应该其所以的真因子之和要是该完全数的两倍;
要遍历该数的所有真因子在加起来,判断是否是该数的两倍,如果是那就是完全数,否则就不是;遍历完每个数记得将其记录真因子之和清空;
代码实现;
int main() {int n=0;scanf("%d",&n);int i=0;int count=0;//记录真因子之和int sum=0;//记录完全数的个数for(i=1;i<n;i++){int j=0;for(j=1;j<=i;j++){if(i%j==0)//是真因子就进入{count+=(i/j);}}if(count==2*i)//真因子之和是否为该数的两倍{sum++;}count=0;}printf("%d",sum);return 0;
}
第三题:单词倒排
地址:oj地址
解题思路:
思路:要满足题目要求的四个条件;
根据示例2:如果不是构成单词的字符只有26个大写或小写英文字母中的范围内,就打印空格.如果要单词倒排,我们可以创造两个数组,一个数组存放的原输入的字符串,另一个数组用来存放倒排之后的字符串,然后打印出来就可以;
具体过程:
注意:设存放原输入的字符串的数组为arr
,另一个数组设为num
;我们可以在输入进arr
数组的时候就进行判断,如果不是 (构成单词的字符只有26个大写或小写英文字母)该范围里的,就输入一个空格‘ ’
;
设置一个指针指right
向数组的最后一个元素,然后往前找空格,找到空格(记录该位置)就代表找到了最后一个单词的首字符,然后在依次输入num
数组中,完成后,让指针又回到记录的那个空格的位置,判断是否为空格,如果是空格,就把空格输入num
数组的同时指针right往前走,直到不是空格,这时指针指向的是倒数第二个单词的最后一个字符,然后后续按照上述的过程进行循环,直到将原来arr
数组中的字符串全部都输入进了num
数组,就跳出总循环;
代码实现:
#include <stdio.h>int main() {char arr[10001];char num[10001];char ch = 0;int i = 0;int j = 0;while ((ch = getchar()) != '\n') {if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))arr[i] = ch;elsearr[i] = ' ';i++;}int right = i - 1;int count = 0;//记录这个单词多少个字节while (right >= 0) {//找到单词的开头位置while (arr[right] != ' ' && right >= 0) {count++;right--;}int tem = right;//记住这个位置while (count--) //输入num数组{num[j] = arr[right + 1];j++;right++;}right = tem;while (arr[right] == ' ') //如果是空格也传入num数组{num[j] = arr[right];right--;j++;}count = 0;//记得每次传完单词后要记录新的单词,这里要清0;}for (i = 0; i < j; i++) {printf("%c", num[i]);}return 0;
}
总结
到了最后:感谢支持
我还想告诉你的是:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的