문제

나는 생각에 특정의를 표시하는 방법을 매김 컨트롤을 사용할 때 언어와 같은 C#또는 Java.

가 있는 경우 x 항목 내에 표시하고 싶의 덩어리 y 페이지당 얼마나 많은 페이지를 필요할 것인가?

도움이 되었습니까?

해결책

을 발견한 솔루션:

int pageCount = (records + recordsPerPage - 1) / recordsPerPage;

출처: 번호 변환,롤랜드 옥외 변소,2001

다른 팁

변환하여 부동 소수점과 다시처럼 보인다 거대한 시간의 낭비에서 CPU 수준입니다.

이안 넬슨의 솔루션:

int pageCount = (records + recordsPerPage - 1) / recordsPerPage;

수 단순화할 수 있습니다:

int pageCount = (records - 1) / recordsPerPage + 1;

AFAICS,이 없 오버플로는 버그랜 DuRette 지적하고,그것 때문에만 사용하면,당신은 당신이 필요하지 않 저장 recordsPerPage 이 특별히 있다면 그것은 오에서는 비싼 기능을 가져오는 값 config 파일에서 또는 무언가이다.

I.e.이 될 수 있는 비효율적이,면 config.fetch_value 사용되는 데이터베이스를 조회하거나 뭔가:

int pageCount = (records + config.fetch_value('records per page') - 1) / config.fetch_value('records per page');

이 변수를 만듭니다 당신은 정말 필요 없는,아마(미성년자)메모리 의미와 너무 많이를 입력:

int recordsPerPage = config.fetch_value('records per page')
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;

이것은 모두 하나의 행만 가져옵 데이터:

int pageCount = (records - 1) / config.fetch_value('records per page') + 1;

C#솔루션을 캐스팅 값을블(으로 수학이다.천장 소중):

int nPages = (int)Math.Ceiling((double)nItems / (double)nItemsPerPage);

자바에서 같은 작업을 수행해야 합 가진 수학이다.ceil().

이해 당신이 무엇을 원합니다.당신은 확실히 원하는 x 항목을 나누 y 페이지당 항목,문제는 고르지 못한 경우 번호를 올무가 있는 경우 부분적인 페이지는 또한 우리를 추가하려 한 페이지입니다.

int x = number_of_items;
int y = items_per_page;

// with out library
int pages = x/y + (x % y > 0 ? 1 : 0)

// with library
int pages = (int)Math.Ceiling((double)x / (double)y);

정수한 수학하는 솔루션을 이안 제공하는 좋은,하지만에서 겪고 있는 정수 오버플로 버그입니다.가정 변수들은 모든 int, 솔루션이 될 수 있을 사용하여 다시 작성 long 수학과 피 bug:

int pageCount = (-1L + records + recordsPerPage) / recordsPerPage;

는 경우 recordslong,버그에 남아 있습니다.모듈러스 솔루션이 없습니다.

의 변형 닉 버 라드의 대답이 피하는점:

int q = records / recordsPerPage, r = records % recordsPerPage;
int pageCount = q - (-r >> (Integer.SIZE - 1));

참고: (-r >> (Integer.SIZE - 1)) 로 구성되어 있 sign 트 r, 반복 32 번(주셔서 감사합니다명의 확장 >> 연산자입니다.) 이 평가는 경우 0 r 로 또는 부정적인 경우 -1 r 은 긍정적이다.그래서 빼는 그것에서 q 추가하는 효과가 있는 경우 1 records % recordsPerPage > 0.

에 대한 기록을==0,rjmunro 의 솔루션을 제공합니다 1.올바른 솔루션은 0 입니다.는 말했다,당신이 알고 있는 경우는 레코드>0(그리고 나는 확실히 우리는 모든 것을 가정 recordsPerPage>0)rjmunro 솔루션을 제공합 정확한 결과가 없의 오버플로 문제입니다.

int pageCount = 0;
if (records > 0)
{
    pageCount = (((records - 1) / recordsPerPage) + 1);
}
// no else required

모든 정수한 수학 솔루션은 더 효율적이다 의 부동 소수점는 솔루션입니다.

에 필요 확장의 방법:

    public static int DivideUp(this int dividend, int divisor)
    {
        return (dividend + (divisor - 1)) / divisor;
    }

아니 여기에 검사(오버플로, DivideByZero,etc.),무료 느낌을 추가하는 경우 다음과 같.의 방법으로 사람들에 대해 걱정 메소드 호출 오버헤드 간단한 함수는 다음과 같이 될 수 있는 인라인하여 컴파일러는 어쨌든,그래서 나는 생각하지 않는 것을 우려하고있다.환호를 받았다.

P.S.당신이 그것을 찾을 수 있습 유의해야 하는 이뿐만 아니라(더 나머지 부분):

    int remainder; 
    int result = Math.DivRem(dividend, divisor, out remainder);

또 다른 대안은 사용하는 모드()함수(또는'%').이 있는 경우 non-zero 나머지는 다음을 증가시키 정수의 결과다.

나는 다음,손잡이 모든 오버플로우:

var totalPages = totalResults.IsDivisble(recordsperpage) ? totalResults/(recordsperpage) : totalResults/(recordsperpage) + 1;

고 사용이 확장을 위해이있는 경우의 0 결과:

public static bool IsDivisble(this int x, int n)
{
           return (x%n) == 0;
}

또한,현재 페이지 번호(지 물었지만 도움이 될 수 있):

var currentPage = (int) Math.Ceiling(recordsperpage/(double) recordsperpage) + 1;

대안을 제거 분기에 대한 테스트 zero:

int pageCount = (records + recordsPerPage - 1) / recordsPerPage * (records != 0);

가 확실하지 않으면 이에서 작동합니다 C#,수행해야에서는 C/C++.

C#을 사용하여 수학이다.천장 기능:

var pageCount= Math.Ceiling((double)myList.Count() / recordsPerPage);

Java 사용하여 수학이다.Ceil 기능:

int n = (int) Math.ceil((double)myList.size() / recordsPerPage));

일반적 방법,그 결과를 반복할 수 있을 통해 관심이있을 수 있습니다:

public static Object[][] chunk(Object[] src, int chunkSize) {

    int overflow = src.length%chunkSize;
    int numChunks = (src.length/chunkSize) + (overflow>0?1:0);
    Object[][] dest = new Object[numChunks][];      
    for (int i=0; i<numChunks; i++) {
        dest[i] = new Object[ (i<numChunks-1 || overflow==0) ? chunkSize : overflow ];
        System.arraycopy(src, i*chunkSize, dest[i], 0, dest[i].length); 
    }
    return dest;
}

나는 유사한 필요는 내가 필요로 변환하 분 시간 및 분입니다.내가 무엇을 사용:

int hrs = 0; int mins = 0;

float tm = totalmins;

if ( tm > 60 ) ( hrs = (int) (tm / 60);

mins = (int) (tm - (hrs * 60));

System.out.println("Total time in Hours & Minutes = " + hrs + ":" + mins);

다음과 같은 해야 할지 반올림보다 더 위한 솔루션이지만,비용의 성능(인해 유동점의 계산 0.5*rctDenominator):

uint64_t integerDivide( const uint64_t& rctNumerator, const uint64_t& rctDenominator )
{
  // Ensure .5 upwards is rounded up (otherwise integer division just truncates - ie gives no remainder)
  return (rctDenominator == 0) ? 0 : (rctNumerator + (int)(0.5*rctDenominator)) / rctDenominator;
}

당신은 하고 싶은 부동 소수점 부문에,다음 사용하여 천장,기능을 가치를 다음의 정수입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top