禁止使用循环判断求1+2+3+..n

题目描述

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

思路:

看到这一题的时候,不能使用乘除法和循环判断,当时就想到了使用二进制移位的方法,因为二进制不就只有加法操作,而且所有的计算在计算机里都是二进制操作。

首先:1+2+3+..+n  =   n(1+n)/2

其次需要了解一下二进制相关性质:

二进制数左移或右移N位等于扩大或缩小2的N次方倍

2进制的基数为2
所以
扩大10倍,相当于×2
缩小10倍,相当于÷2

扩大一倍,相当于x2的1次方
即左移或右移N位等于扩大或缩小2的N次方倍

现在把上面的求和公式变一下  =n2  + n  再根据上面的性质可得   n2次方幂+n  是1+2+3..+n的2的1次方倍,所以把结果想右移一位即可。

(PS:虽然可以通过,但发现我跑题了,Math.pow(n, 2)还不是用了好像判断,乘法,三元运算符都用上了,把这个思路写上来算是让自己多了解位运算吧)

 1 public class Solution {
 2     public int Sum_Solution(int n) {
 3
 4         int res=(int)(Math.pow(n, 2)+n);
 5
 6         res=res>>1;
 7         return res;
 8
 9     }
10 }

也附上pow函数的算法,作为巩固

 1 public class Solution {
 2     public double Power(double base, int exponent) {
 3
 4         double res = 1;
 5
 6         int p = Math.abs(exponent);
 7
 8         while (p != 0) {
 9
10             if ((p & 1) != 0) {
11
12                 res *= base;
13
14             }
15             base *= base;
16             p >>= 1;
17         }
18
19         return exponent < 0 ? 1 / res : res;
20
21     }
22 }

下面这种方法是摘录过来的,运用了 逻辑运算符  &&,想法很好。

1.需利用逻辑与的短路特性实现递归终止。 2.当n==0时,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回0

3.当n>0时,执行sum+=Sum_Solution(n-1),实现递归计算Sum_Solution(n)。

1 public int Sum_Solution(int n) {
2         int sum = n;
3         boolean ans = (n>0)&&((sum+=Sum_Solution(n-1))>0);
4         return sum;
5     }

给自己做个笔记:

1、逻辑运算的短路特性:
(表达式1)&&(表达式2) 如果表达式1为假,则表达式2不会进行运算,即表达式2“被短路”
(表达式1)||(表达式2) 如果表达式1为真,则表达式2不会进行运算,即表达式2“被短路”

2:逻辑运算和位运算(之前真没注意二者的细致区别,好像还混用了 &    &&)

位运算符

Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。

位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:

逻辑运算符

下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假

原文地址:https://www.cnblogs.com/Octopus-22/p/9461533.html

时间: 2024-08-28 23:36:06

禁止使用循环判断求1+2+3+..n的相关文章

1. while循环(当循环) 2. do{}while()循环 3. switch cose(多选一) 例子:当选循环下求百鸡百钱 用 switch cose人机剪刀石头布

1. while循环: 当选循环下求百鸡百钱:如下: 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><me

shell文本过滤编程(六):awk之循环判断及数组

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 与上一节printf一样,awk的循环判断和C语言的循环判断语法极其类似. 1. While循环 #!/bin/sh awk ' BEGIN { ORS="" } { i=0 while (i < NF) { printf("* ") i++ } print "\n" } ' group_file1 首先,

Python条件循环判断

1.条件判断语句 Python中条件选择语句的关键字为:if .elif .else这三个.其基本形式如下: 1 2 3 4 5 6 7 8 9 age_of_cc = 27 age = int(input("guessage:")) if age == age_of_cc:     print("Yes,you got it!") elif age > age_of_cc:     print("猜大啦!") else:     prin

循环-26. 求给定序列前N项和之四

循环-26. 求给定序列前N项和之四(15) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 来源 ZOJ 本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和. 输入格式: 输入在一行中给出一个正整数N. 输出格式: 在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后3位.题目保证计算结果不超过双精度范围. 输入样例: 10 输出样例: sum = 0.819 1 #incl

循环-01. 求整数段和

循环-01. 求整数段和(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 杨起帆(浙江大学城市学院) 给定两个整数A和B,输出从A到B的所有整数以及这些数的和. 输入格式: 输入在一行中给出2个整数A和B,其中-100<=A<=B<=100,其间以空格分隔. 输出格式: 首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐.最后在一行中输出全部数字的和. 输入样例: -3 8 输出样例

循环-21. 求交错序列前N项和

1 /* 2 * Main.c 3 * C21-循环-21. 求交错序列前N项和 4 * Created on: 2014年8月18日 5 * Author: Boomkeeper 6 ***********测试通过******** 7 */ 8 9 #include <stdio.h> 10 11 int main(void){ 12 13 float numerator = 1; 14 float denominator = 1; 15 16 int N = 0;//前N项和 17 flo

循环-03. 求符合给定条件的整数集

1 /* 2 * Main.c 3 * c3-循环-03. 求符合给定条件的整数集 4 * Created on: 2014年7月23日 5 * Author: Boomkeeper 6 *****测试通过******* 7 */ 8 9 #include <stdio.h> 10 11 void cal(int input){ 12 int i,j,k; 13 int count=0; 14 15 for(i=input;i<=(input+3);i++){ 16 for(j=inpu

循环-01. 求整数段和(15)

给定两个整数A和B,输出从A到B的所有整数以及这些数的和. 输入格式: 输入在一行中给出2个整数A和B,其中-100<=A<=B<=100,其间以空格分隔. 输出格式: 首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐.最后在一行中输出全部数字的和. 输入样例: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner ci

循环-28. 求给定序列前N项和之六

循环-28. 求给定序列前N项和之六(15) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 来源 ZOJ 本题要求编写程序,计算序列 2^1 + 22 + 23 + ... 的前N项之和. 输入格式: 输入在一行中给出一个不超过30的正整数N. 输出格式: 在一行中按照“sum = S”的格式输出部分和的整数值S. 输入样例: 5 输出样例: sum = 62 1 #include<stdio.h> 2 #include<ma