我需要编写一个程序,用户输入2个数字,然后给出该范围内所有奇数的总和 plus 用户输入的2个数字。我进行了很多搜索,但没有找到任何包含限制的内容。到目前为止,我有:
x=int(input('Enter first number: '))
y=int(input('Enter second number: '))
def SumOdds(x,y):
count=0
for i in range(x,y):
if (int(i%2==1)):
count=count+i
print(count)
SumOdds(x,y)
这给出赔率的总和,但不包括限制。例如,假设我输入了10和20。这给了我75,但是它需要加上10和20才能达到105。我确定这是一个简单的解决方法,但是我对Python还是很陌生任何帮助,将不胜感激。谢谢!
答案 0 :(得分:2)
因此,您所缺少的就是在完成for循环时将两个数字相加。试试这个:
x=int(input('Enter first number: '))
y=int(input('Enter second number: '))
def SumOdds(x,y+1):
count= x + y #notice instead of 0, it's the sum now!
for i in range(x,y):
if(i == x or i == y):
pass
elif (int(i%2==1)):
count=count+i
print(count)
SumOdds(x,y)
编辑:根据您的评论,如果限制很奇怪,您将不想添加两次。 y+1
确保您捕获了整个范围,而i == x or i == y
的检查会跳过范围中的那些值,因为我们已经在开始时将它们添加了。
答案 1 :(得分:1)
只需单独检查边界。
x=int(input('Enter first number: '))
y=int(input('Enter second number: '))
def SumOdds(x,y):
count=0
for i in range(x,y):
if (int(i%2==1)):
count=count+i
if(x%2==0):
count= count+x
if(y%2==0):
count= count+7
print(count)
SumOdds(x,y)
基本循环应包含任何奇数个限制,因此,如果它们是奇数,则只需添加限制。
答案 2 :(得分:1)
在range(..)
对象中,“上限”(第二个参数)是专有的。因此,为了解决此问题,使用range(x, y+1)
就足够了,例如:
def SumOdds(x, y):
count=0
for i in range(x, y+1):
if i%2==1:
count=count+i
print(count)
SumOdds(x,y)
但是请注意,由于可以使用以下公式来计算总和,因此我们可以提高速度:
n
---
\ 2 2
/ 2*i + 1 = (n+1) - m
---
i=m
因此我们可以将其计算为:
def sumOdds(x, y):
m = x//2
n1 = ((y-1)//2)+1
print(max(0, n1*n1 - m*m))
此方法的优点是,它适用于 O(1)(适用于小到不太小的数字),适用于 O(log m + log n)(适用于大数字)数字(因为乘法运算可能会花费更多时间)。
因此,我们可以非常快速地计算出大量数字的总和,例如:
>>> timeit.timeit(lambda: SumOdds(12345678901234567890, 98765432109876543210), number=1000000)
0.5030524220055668
因此,计算12'345'678'901'234'567'890和98'765'432'109'876'543'210之间的奇数元素之和可以用503纳秒计算。迭代方法将花费线性时间,并且可能不会在合理的时间内获得结果。
答案 3 :(得分:1)
首先,我将范围扩大到y+1
,然后考虑该范围内的所有赔率,在我检查x
和y
是否相等之后,我将它们添加到清单。
x = int(input('Enter first number: '))
y = int(input('Enter second number: '))
tot = [i for i in range(x, y+1) if i % 2]
if not x % 2:
tot.append(x)
if not y % 2:
tot.append(y)
print(sum(tot))
答案 4 :(得分:0)
我感觉好像在这里可能遗漏了一些东西-您已经将端点作为参数了,那么为什么不将它们添加为计数呢?
x=int(input('Enter first number: '))
print x
y=int(input('Enter second number: '))
print y
def SumOdds(x,y):
count = x + y
# x + 1 for an exclusive range, i.e (10, 20) will check the numbers 11-19
for i in range(x+1, y):
if (int(i % 2 ==1 )):
count= count + i
print(count)
SumOdds(x,y)
此外,通过列表理解的魔力,您还可以将for循环减少到一行:
x=int(input('Enter first number: '))
y=int(input('Enter second number: '))
def SumOdds(x,y):
# x + y + each i in range 11-19, if i is odd
count = x + y + sum(i for i in range(x+1, y) if i % 2 == 1)
print(count)
SumOdds(x,y)
答案 5 :(得分:0)
由于Python范围的工作方式,您应该将范围的第二个数字扩展一个(包括第一个数字和最后一个数字)。然后,根据实际情况计算奇数和,最后只需将两个输入的数字加到奇数和中即可。您可以为此创建一个新变量(如下所示),也可以将其添加到奇数和变量中。
x1=int(input('Enter first number: '))
x2=int(input('Enter second number: '))
def sum_odds(x1, x2):
odd_sum = 0
total_sum = 0
for number in range(x1, x2+1):
if number % 2 != 0:
odd_sum+=number
total_sum = odd_sum + x1 + x2
print(total_sum)
return total_sum
sum_odds(x1,x2)
答案 6 :(得分:0)
sum([i for i in range(x, y+1) if not i%2==0])
这还不够吗?
答案 7 :(得分:0)
为避免两次添加限制,您也可以使用集合。乍看之下并不简单,但是它可以使您的代码更加优雅。
x=int(input('Enter first number: '))
y=int(input('Enter second number: '))
def sum_odds_and_limits(x,y):
to_sum = set() #sets are collections of unique elements
to_sum |= {x,y} #union
for num in range(x,y+1):
if num%2==1 :
to_sum|={num}
print(sum(to_sum))
sum_odds_and_limits(x,y)
出于效率考虑,我建议您避免在循环中使用模数(%)和条件。切片符号是python中执行此操作的好工具:
range(x,y+1)[(x+1)%2::2]
#list()[<start position>:<ending position>:<take every N element>]
然后您将得到如下代码:
x=int(input('Enter first number: '))
y=int(input('Enter second number: '))
def sum_odds_and_limits(x,y):
#sum all the odd numbers and boundaries in the given range
to_sum = set(range(x,y+1)[(x+1)%2::2])
to_sum |= {x,y}
print(sum(to_sum))
sum_odds_and_limits(x,y)
我坚持要明确函数名称。但这是个人的。
答案 8 :(得分:0)
也许我们可以使其更简单一些...试试
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int n = 4;
int adjacency_matrix[][4] = {
{0, 1, 1, 0}, // 0-->1-->3
{0, 0, 0, 1}, // | ^
{0, 0, 0, 1}, // v |
{0, 0, 0, 0} // 2-------+
};
int indegrees[n];
bool visited[n];
memset(&indegrees, 0, sizeof(*indegrees) * n);
memset(&visited, false, sizeof(*visited) * n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
indegrees[i] += adjacency_matrix[j][i];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!indegrees[j] && !visited[j]) {
visited[j] = true;
printf("%d ", j + 1);
for (int k = 0; k < n; k++) {
if (adjacency_matrix[j][k]) {
adjacency_matrix[j][k] = 0;
indegrees[k]--;
}
}
break;
}
}
}
return 0;
}