几个看似复杂实则简单的笔试题

题目一

计算1到n的累加和
题目描述:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

*竟然不能用乘除法和循环以及条件判断语句,乍一看这也太变态了吧。还好可以用加法!用递归来代替循环,然后从n+n-1开始,一直加到n=0结束。那么问题是,如何判断n!=0呢? 这里便用到一个基本的运算符 “&&” ,与运算符在运行时,只有两边都为真,结果才为真,那么只要前面条件为假,后面的运算将不再进行。伪代码表示:
if n!=0
sum+=f(n-1)
*

Java代码实现如下:

 public static int f(int n) {
	int sum = n;
	boolean t = (n != 0) && (sum = sum + f(n - 1)) != 0;
	return sum;
    }
  • 这个 && 逻辑判断符的作用就是:如果 n != 0 成立的话,那么逻辑判断符后面的判断语句 (f(n-1) + n ) != 0 也会执行, 如果 n!= 0 不成立的话,那么后面的判断语句 ((f(n-1) + n)) != 0 就不会执行,通过这种方法,就可以达到我们递归结束条件判断的目的了。

  • 这里说明一下,(f(n-1) + n) != 0 这条判断语句是没有任意其他含义的,我们的目的是为了执行 f(n-1)+n,之所以加上个 != 0 的判断,是因为逻辑 判断符号 && 只支持 boolean 类型,不支持 int 类型。

题目二

两个数相乘
题目描述:实现两个整数的相乘,不能使用乘法运算符和循环

这个题可能就比较简单了,不能使用乘法和循环,但我们可以使用除法呀,
A
B=A/(1/B)*
Java代码实现如下:

 public static int mult(int a, int b) {
	return b != 0 ? (int) (a / (1.0 / b) + 0.99) : 0;
    }
  • 一行代码搞定,如果b!=0 那么就让a乘1/b,反之结果为0。
    但是这里有个问题,1/b数据类型为double,而两个整数相乘结果必然为整数,这里需要int进行转化类型,但是除法可能会导致后面尾数的丢失,所以我补了个0.99。注意,进行 int 类型转化时,小于 1 就行当做0处理。0.99又会被舍去。不影响最终结果。

题目三

求两数之和
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

方法一:

  • 在绞尽脑汁之后,想到了数电曾学过的异或运算。如果我们把两个数进行异或,例如num1 = 101, num2 = 001,做异或运算:tmp = num1 ^ num2,结果是 tmp =100。那么此时得到的结果 tmp 其实就是两个数(num1,num2)各个二进制位上相加,不算进位的结果。而 num1 = (num1 & num2)<<1的结果就是两个数相加时那些需要进位的二进制位。例如 (101 & 001)<< 1=010,那么两个数第一位相加需要进位,我们需要把进的 那一位最后加到第二位上去。 说白就是 a + b = a ^ b + (a & b) << 1。 代码中,如果 num1 == 0的话,代表没有进位了,此时就可以退出循环了。
    Java代码实现如下:
 public static int Add(int num1, int num2) {
	int tmp = 0;
	while (num1 != 0) {
	    tmp = num1 ^ num2;
	    num1 = (num1 & num2) << 1;
	    num2 = tmp;
	}
	return num2;

方法二:

  • java方法库中有一个BigInteger的方法,它可以表示任意大的数,而这个方法的四则运算也都是用函数来进行,不会涉及四则运算符号,也算是投机取巧了一次。

Java代码实现如下:

public static int Add(int num1, int num2) {
		BigInteger b1 = new BigInteger(String.valueOf(num1));
		BigInteger b2 = new BigInteger(String.valueOf(num2));
		return b1.add(b2).intValue();
	}

未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值