问题1:选取奇数个数的数字
问题描述:
思路分析:
原本最开始的想法,我是想用循环的方法,统计每一个数字出现的次数。后来查到一种比较方便的方法,可以采用异或的方法来做。因为只有一个数字出现奇数次,其他数字都是出现偶数次,两个相同的数字异或的结果是逻辑0,一个逻辑非0的数字与逻辑0异或等于原来那个逻辑非0的数字,所以输入的所有数字异或之后,最后的结果就是出现奇数次的数字。
代码如下:
代码解析:
fgets(buff,sizeof(buff),stdin) 意思就是说从标准输入读入最多buff个字符,存储到buff中,由于最后一个读入的字符是换行符,由于两个奇数次出现的字符参与异或的话,最后不会输出只出现一次的字符,因此,在使用异或运算时,最后不能把换行符参与运算,所以最后的循环条件中
问题2:平方根
问题描述:
思路分析:
通过牛顿迭代公式可以求出这道题。
设置输入的数值为x,定义两个变量x1,x2,x1初值为1,x2初值为,后面不断循环两步操作:,直到(x1-x2)的绝对值小于或等于
1e-4。
代码如下:
问题3:中文读正整数
问题描述:
思路分析:
首先,定义一个char型的字符数组来接收输入的数字。由于输入的数组像堆栈一样,先输入的数字被压在下面,读出的时候是从栈顶开始读取,因此,需要把数组倒置过来。
其次,判断零。由于多个“0”连续在一起的时候,我们也只读一个零,因此,我们需要定义一个flag来判断是否有多个“0”。当遇见“0”时,我们只执行flag为1;当遇见非零数字时,才来判断flag是否为1,判断前面是否有“0”,不管前面连着几个“0,flag是1的话就读一个零,如果flag不是1,就照常按照其他非零数字的读法读中文。
最后,由于我们使用fgets()来读取数据,fgets()会把我们最后输入的换行符接收,因此,我们在接收完字符后,要把最后一个换行符替换成结束符,这样,在倒置函数中使用strlen计算字符串长度时,最后一个结束符就不会被计算进来,如果是换行符就会被计算进来。