Ripple-Carry AdderProblem code: RIPPLE |
All submissions for this problem are available.
Amortized analysis deals with analyzing the average amount of work done per operation over a series of operations. In some cases, the average amount of work done per operation is dramatically less than the worst case analysis indicates.
A typical example is counting the number of times a bit is flipped in a ripple-carry counter. A ripple-carry counter is an implementation of a binary counter where incrementing from B to B+1 is done in the following manner. Say the binary number is represented as B = bn-1b_n-2...b_1b0 where bi is the bit corresponding to 2i. B is increased to B+1 in the following manner:
i := 0
while bi == 1
bi := 0
i := i+1
bi := 1
This doesn't account for overflow when increasing from 2n-1 to 2n, but we'll ignore that error for this problem.
Each time a bit is changed from 0 to 1 or from 1 to 0 we say the bit is "flipped". In the worst case, we may have to flip every bit. However, a standard result says the average number of bits flipped per increment when counting from 0 to 2n-1 is less than 2.
Being the curious sort, you decide to explore this result in a slightly more general setting. That is, you want to know how many bits are flipped when the counter is incremented from a number a to b where a < b.
Input
The first line denotes the number of test cases (about 20).
Each test case consists of three lines. The first contains a single integer n between 1 and 100,000 denoting the number of bits in the counter. The second line contains the number a written in binary and the third line contains the number b written in binary. Both a and b are described using exactly n bits.
Output
The output for each test case consists of a single line that describes the total number of bits flipped when the counter is increased from a to b. This number should be expressed in binary with the most significant bit being 1 (i.e. no leading zeros should pad the output).
Example
Input:
3
1
0
1
2
00
11
3
011
100
Output:
1
100
11
| Date: | 2010-05-08 |
| Time limit: | 3s |
| Source limit: | 50000 |
| Languages: | C C99 strict C++ 4.0.0-8 C++ 4.3.2 PAS gpc PAS fpc JAVA NICE JAR C# C#2 NEM ST ASM D FORT ADA BASH PERL PYTH RUBY LUA ICON PIKE PHP SCM guile SCM qobi LISP sbcl LISP clisp SCALA HASK ERL CAML CLPS PRLG WSPC BF ICK JS |
Comments

Fetching successful submissions

what is the limit of a and b?
what is the limit of a and b?
Quoting from the problem
please explane how 00 goes to
please explane how 00 goes to 11
using given algo
because bi==1 is not satisfied it will do nothing
Hello admin, A question
Hello admin,
A question regarding Incrementing code?
What are the exact instructions inside the while block?
Is the last line i.e. ------> bi := 1 inside while loop or not ?
Yes, there was an ambiguity
@atul: There was a problem in
How's 00 turned to 11
How's 00 turned to 11 according to algorithm? Still unclear.
@Karan Dwivedi: The algorithm
@Karan Dwivedi: The algorithm mentioned only increments one number at a time. You need to run it 3 times to achieve your result
hi admin is there a way to
hi admin
is there a way to get the solutuions for the contest problems once the contest is over
@Siddharth SIngh Bisht: We
@Siddharth SIngh Bisht: We shall make it public once the contest is over
my program is giving correct
my program is giving correct o/p.What's wrong in that?
@anup Yes, run it 3 times, so
@anup Yes, run it 3 times, so the answer is 3, converted into binary would be 11, not 100?
Is analysis of that problem
@Igor: You may check the
@Igor: You may check the problem editorial here.