Principle and Implementation of the integer division algorithm

Source: Internet
Author: User
Tags integer division

The integer division problem is to split a positive integer N into a group of numbers plus N, and the maximum number of integers in this group is not greater than N.
For example, 6 is divided into Integers

6
5 + 1
4 + 2, 4 + 1 + 1
3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1
2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1 + 1

A total of 11 types. The following describes a recursive method to obtain the number of partitions of a positive integer.

The declaration of recursive functions is int split (int n, int m), where N is the positive integer to be divided, and m is the maximum addition in the Division (when m> N, n ),
1 When n = 1 or M = 1, the split value is 1. As shown in the preceding example, only one partition is 1 or 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
Available Program If (n = 1 | M = 1) return 1;

2. Let's take a look at the relationship between M and N. They have three relationships.
(1) m> N
In integer division, the maximum addition number cannot be greater than N. Therefore, this can be equivalent to split (N, N );
Available programs are represented as if (M> N) return split (N, N );
(2) M = N
In this case, it can be recursively expressed as split (n, m-1) + 1. From the above example, we can see that
The sum of the numbers 6 and less than 6
Expressed as if (M = N) Return (split (n, m-1) + 1) using a program );
(3) M <n
This is the most common case.
As shown in the preceding example, if M is set to 4, the split (6, 4) value is the sum of the number of splits whose maximum number is less than 4 and integer 2.
Therefore, split (n, m) can be expressed as split (n, m-1) + split (n-M, m)

Based on the above description, the source code is as follows:

# Include < Stdio. h >

Int Split ( Int N, Int M)
{
If (N <   1   | M <   1 ) Return   0 ;
If (N =   1   | M =   1 ) Return   1 ;
If (N < M) Return Split (N, N );
If (N = M) Return (Split (n, m -   1 ) +   1 );
If (N > M) Return (Split (n, m -   1 ) + Split (n - M), m ));
}

int main ()
{< br> printf ( " 12: % d " , split ( 12 , 12 ));
return 0 ;
}


Divide a positive integer into the sum of consecutive positive integers.
For example, 15 can be divided into four forms of continuous integer addition:
15
7 8
4 5 6
1 2 3 4 5

First consider the general form, set N to the positive integer to be divided, and X to the smallest integer after division. If n has a division, then
The result is X. If there are two types of division, X and x + 1. If there are m types, is x, x + 1, x + 1 x + 2 ,..., x + 1 x + 2... X + m-1
Add each result to obtain a formula (I * x + I * (I-1)/2) = n, and I is the number of integers added after the current division.
The Division that satisfies the condition is all the conditions that make X a positive integer.
In the above example, when I = 1, it is divided into a positive integer, x = 15, and when I = 2, x = 7.
If X = 3, x = 4, and X = 4, 4/9 is not a positive integer. Therefore, 15 cannot be divided into four integers.
When x = 5, x = 1.

There is another question: what is the maximum I value? However, it must be smaller than N. We can make a hypothesis,
Assume that N can be split into a division with a minimum value of 1. In the preceding example, 1 2 3 4 5. This is the maximum number of N. If this assumption is not met,
Then I must be smaller than the number of positive integers in this division. Therefore, we can obtain the formula I * (I + 1)/2 <= N, that is, when I satisfies
In this formula, N can be divided.

Based on the above, the source program is as follows:

Int Split1 ( Int N)
{
Int I, j, m =   0 , X, T1, T2;
// Here I + 1 is changed to I-1 because I * (I-1)/2 is used multiple times below,
// To avoid repeated computation, the value is saved in T1 after calculation. And change <= to <.
For (I =   1 ; (T1 = I * (I -   1 ) /   2 ) < N; I ++ )
{
T2 = (N - T1 );
X = T2 / I;
If (X <=   0 ) Break ;
If (N - T1) % I =   0 )
{
Printf ( " % D " , X );
For (J =   1 ; J < I; j ++ )
Printf ( " % D " , X + J );
Printf ( " \ N " );
M ++ ;
}
}
Return M;
}

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.