Почему мой оператор по модулю возвращает удвоенный размер блока для входных данных размером 1 байт?
Идея состоит в том, чтобы создать функцию под названием калькулятор, которая принимает входные данные и сравнивает их с переменной. Сравните размер файла с размером блока и, если есть остаток, удвойте размер блока, чтобы учесть его использование. Моя проблема в том, что при вводе 1 я все равно получаю 8192? Однако остальные расчеты оказались верными. Я знаю, что деление этажа дает только целое число, а не число с плавающей запятой (что, как я думал, может быть лучшим способом сделать это, потому что мне нужно было действительное число), но когда я пытаюсь переместить его, я получаю тот же результат. Я также пробовал плавать в другом месте, но с неверными или теми же результатами, что и выше. Когда я изменил порядок по модулю, ответ кажется правильным, но мне сообщили, что это неверно, и мне сказали сделать это больше, чем вы видите здесь, с разделением этажей и модулем в этом порядке.
Итак, мой вопрос: почему я получаю 8192 при вводе 1, а остальные верны?
def calculator(somedata): # calculator function, 'somedata' is the input
blocksize = 4096 # what block size on the partition
# calculate how many blocks are fully occupied
fullblock = somedata // blocksize # floor division will give back only the integer yes?
# modulo to check whether there's any remainder
bytesremain = somedata % blocksize # which will say 1 or None unless I float yes?
# return the block usage based on byte count?
if bytesremain > 0: # if there's anything left over in the bytesremain
return(blocksize * 2) # double the block usage to 2
return blocksize # otherwise return the block usage
print(calculator(1)) # Should be 4096
print(calculator(4096)) # Should be 4096
print(calculator(4097)) # Should be 8192
print(calculator(6000)) # Should be 8192
10 ответов
Вы наверняка ищете:
def calculator(somedata):
blocksize = 4096
fullblock = (somedata-1) // blocksize
return blocksize*(fullblock+1)
full_blocks = filesize // block_size
partial_block_remainder = block_size % filesize
def calculate_storage(filesize):
block_size = 4096
# Use floor division to calculate how many blocks are fully occupied
full_blocks = filesize // block_size
# Use the modulo operator to check whether there's any remainder
partial_block_remainder = filesize % block_size
# Depending on whether there's a remainder or not, return
# the total number of bytes required to allocate enough blocks
# to store your data.
if partial_block_remainder > 0:
return full_blocks * block_size + block_size
return full_blocks * block_size
def calculate_storage(filesize):
block_size = 4096
# Use floor division to calculate how many blocks are fully occupied
full_blocks = filesize // block_size
# Use the modulo operator to check whether there's any remainder
partial_block_remainder = filesize % block_size
# Depending on whether there's a remainder or not, return
# the total number of bytes required to allocate enough blocks
# to store your data.
if partial_block_remainder > 0:
return block_size*(full_blocks+1)
return block_size
print(calculate_storage(1)) # Should be 4096
print(calculate_storage(4096)) # Should be 4096
print(calculate_storage(4097)) # Should be 8192
print(calculate_storage(6000)) # Should be 8192
def calculate_storage(filesize):
block_size = 4096
# Use floor division to calculate how many blocks are fully occupied
full_blocks = filesize//block_size
# Use the modulo operator to check whether there's any remainder
partial_block_remainder = filesize%block_size
# Depending on whether there's a remainder or not, return
# the total number of bytes required to allocate enough blocks
# to store your data.
if partial_block_remainder > 0:
return (full_blocks*4096)+4096
return (full_blocks*4096)
print(calculate_storage(1)) # Should be 4096
print(calculate_storage(4096)) # Should be 4096
print(calculate_storage(4097)) # Should be 8192
print(calculate_storage(6000)) # Should be 8192
def calculate_storage(filesize):
block_size = 4096
full_blocks = filesize//block_size
if filesize > block_size:
return block_size*2
return block_size
Думаю, это лучшее решение для всех случаев в формате файлов!
Something else to remember here
is the format of modulo arithmetic. The divisor is always to
the right of the modulo operator. E.g.- 2 = 6 % 4 <- This is
the divisor.
def calculate_storage(filesize):
block_size = 4096
# Use floor division to calculate how many blocks are fully occupied
full_blocks = filesize//block_size
# Use the modulo operator to check whether there's any remainder
partial_block_remainder = block_size%filesize
# Depending on whether there's a remainder or not, return
# the total number of bytes required to allocate enough blocks
# to store your data.
if partial_block_remainder > 0:
return block_size*2
return block_size
print(calculate_storage(1)) # Should be 4096
print(calculate_storage(4096)) # Should be 4096
print(calculate_storage(4097)) # Should be 8192
print(calculate_storage(6000)) # Should be 8192
<pre><code>
def cstorage(fsize):
bsize = 4096
fblocks = fsize // bsize
pbremainder = fsize % bsize
if pbremainder > 0:
return bsize*(fblocks+1)
return bsize*fblocks
print(cstorage(1))
print(cstorage(4096))
print(cstorage(4097))
print(cstorage(6000))
</pre></code>
Я пробовал следующее:
import math
def calculate_storage(filesize):
block_size = 4096
full_blocks = math.ceil(filesize/block_size)
return full_blocks*block_size
print(calculate_storage(1))
print(calculate_storage(4096))
print(calculate_storage(4097))
print(calculate_storage(9000))
def calculate_storage(filesize):
block_size = 4096
# Use floor division to calculate how many blocks are fully occupied
full_blocks = filesize // block_size
# Use the modulo operator to check whether there's any remainder
partial_block_remainder = filesize % block_size
# Depending on whether there's a remainder or not, return
# the total number of bytes required to allocate enough blocks
# to store your data.
if partial_block_remainder > 0 and full_blocks >= 1:
return block_size * 2
return block_size
print(calculate_storage(1)) # Should be 4096
print(calculate_storage(4096)) # Should be 4096
print(calculate_storage(4097) # Should be 8192
print(calculate_storage(6000)) # Should be 8192
Мы используем разделение этажей, чтобы вести запись в памяти, чтобы увидеть, сколько блоков потребуется (4096 блоков)
Затем мы проверяем, нет ли блоков напоминаний, которые остались бы при проверке размеров блоков. Это связано с тем, что, хотя размер блока равен 1, но если требуется еще 0,5 размера блока, один блок не сможет его сопровождать.
Наконец, мы создаем два аргумента. Первый - если остаток частичного блока больше нуля, а полные блоки больше или равны единице, размер блока следует удвоить.
Здесь важно отметить, что если мы не поместим предложение AND с full_blocks> = 1, мы не получим правильный ответ для первого, то есть (print (calculate_storage(1)), поскольку нам нужно вычислить, сколько блоков нужны для 1 размера файла.
Когда мы проверяем остаток частичного блока для этого аргумента, то есть (print (calculate_storage(1)), мы получим ответ как 0,000244140625, что означает, что он квалифицирует этот аргумент. Но как только мы добавим аргумент AND с full_blocks> = 1, он будет не соответствует требованиям, потому что ответом для этого будет 0 (full_blocks = 0). Это потому, что, когда вы разделите 1 на 4096, целое число будет равно нулю и с некоторыми десятичными знаками. Поскольку мы используем деление пола для вычисления full_blocks, мы принимаем только учитывайте целую часть, которая равна 0, а не десятичные значения.
Следовательно, если full_blocks больше или равно единице и если partial_block_remainder больше 0, размер блока должен быть удвоен. Если нет, верните размер блока.