Tuesday, December 11, 2012

Constant In C


A C constant is usually just the written version of a number. For example 1, 0, 5.73, 12.5e9. We can specify our constants in octal or hexadecimal, or force them to be treated as long integers.
  • Octal constants are written with a leading zero - 015.
  • Hexadecimal constants are written with a leading 0x - 0x1ae.
  • Long constants are written with a trailing L - 890L.
Character constants are usually just the character enclosed in single quotes; 'a', 'b', 'c'. Some characters can't be represented in this way, so we use a 2 character sequence as follows.
'\n' newline
'\t' tab
'\\' backslash
'\'' single quote
'\0' null ( Usedautomatically to terminate character string )
In addition, a required bit pattern can be specified using its octal equivalent.
'\044' produces bit pattern 00100100.
Character constants are rarely used, since string constants are more convenient. A string constant is surrounded by double quotes eg "Brian and Dennis". The string is actually stored as an array of characters. The null character '\0' is automatically placed at the end of such a string to act as a string terminator.
A character is a different type to a single character string. This is important poing to note.

Defining Constants

ANSI C allows you to declare constants. When you declare a constant it is a bit like a variable declaration except the value cannot be changed.
The const keyword is to declare a constant, as shown below:
int const a = 1;
const int a =2;
Note:
  • You can declare the const before or after the type. Choose one an stick to it.
  • It is usual to initialise a const with a value as it cannot get a value any other way.
The preprocessor #define is another more flexible (see Preprocessor Chapters) method to define constants in a program.
#define TRUE  1
#define FALSE  0
#define NAME_SIZE 20
Here TRUE, FALSE and NAME_SIZE are constant
You frequently see const declaration in function parameters. This says simply that the function is not going to change the value of the parameter.
The following function definition used concepts we have not met (see chapters on functions, strings, pointers, and standard libraries) but for completenes of this section it is is included here:
void strcpy(char *buffer, char const *string)

The enum Data type

enum is the abbreviation for ENUMERATE, and we can use this keyword to declare and initialize a sequence of integer constants. Here's an example:
enum colors {RED, YELLOW, GREEN, BLUE};
I've made the constant names uppercase, but you can name them which ever way you want.
Here, colors is the name given to the set of constants - the name is optional. Now, if you don't assign a value to a constant, the default value for the first one in the list - RED in our case, has the value of 0. The rest of the undefined constants have a value 1 more than the one before, so in our case, YELLOW is 1GREEN is 2 and BLUE is 3.
But you can assign values if you wanted to:
enum colors {RED=1, YELLOW, GREEN=6, BLUE };
Now RED=1, YELLOW=2, GREEN=6 and BLUE=7.
The main advantage of enum is that if you don't initialize your constants, each one would have a unique value. The first would be zero and the rest would then count upwards.
You can name your constants in a weird order if you really wanted...
#include <stdio.h>

int main() {
  enum {RED=5, YELLOW, GREEN=4, BLUE};

  printf("RED = %d\n", RED);
  printf("YELLOW = %d\n", YELLOW);
  printf("GREEN = %d\n", GREEN);
  printf("BLUE = %d\n", BLUE);
  return 0;
}

This will produce following results

  RED = 5
  YELLOW = 6
  GREEN = 4
  BLUE = 5



Copied From Tutorial C

Difference between Near , Far and Huge Pointer

as we know by default the pointers are near for example int *p is a near pointer... size of near pointer is 2 bytes in case of 16 bit compiler........ n we already know very well size varies compiler to compiler...... They only store the offset of the address the pointer is referencing. . An address consisting of only an offset has a range of 0 - 64K bytes.... i think there is no need to discuss near pointers anymore.... so come to the main point..... that is far and huge pointers......

far and huge pointers:
Far and huge pointers have a size of 4 bytes. They store both the segment and the offset of the address the pointer is referencing. thn what is the difference between them ...........
Limitation of far pointer:
We cannot change or modify the segment address of given far address by applying any arithmetic operation on it. That is by using arithmetic operator we cannot jump from one segment to other segment. If you will increment the far address beyond the maximum value of its offset address instead of incrementing segment address it will repeat its offset address in cyclic order. this is also called wrapping.....i.e. if offset is 0xffff and we add 1 then it is 0x0000 and similarly if we decrease 0x0000 by 1 then it is 0xffff and remember there is no change in the segment....
Now i am going to compare huge and far pointers..........

1.
When a far pointer is incremented or decremented ONLY the offset of the pointer is actually incremented or decremented but in case of huge pointer both segment and offset value will change.....
like if we have

int main()
{
char far* f=(char far*)0x0000ffff;
printf("%Fp",f+0x1);
return 0;
}

then the output is:
0000:0000

as we see there is no change in segment value.......

and in case of huge........

int main()
{
char huge* h=(char huge*)0x0000000f;
printf("%Fp",h+0x1);
return 0;
}

then the o/p is:
0001:0000

it shows bcoz of increment operation not only offset value but segment value also change.......... that means segment will not change in case of far pointers but in case of huge it can move from one segment to another ......

2.
When relational operators are used on far pointers only the offsets are compared.In other words relational operators will only work on far pointers if the segment values of the pointers being compared are the same. and in case of huge this will not happen, actually comparison of absolute addresses takes place...... lets understand with the help of an example...
in far...............................

int main()
{
char far * p=(char far*)0x12340001;
char far* p1=(char far*)0x12300041;
if(p==p1)
printf("same");
else
printf("different");
return 0;
}

Output:
different

in huge.......................

int main()
{
char huge * p=(char huge*)0x12340001;
char huge* p1=(char huge*)0x12300041;
if(p==p1)
printf("same");
else
printf("different");
return 0;
}

Output:
same

Explanation:
as we see the absolute address for both p and p1 is 12341 (1234*10+1 or 1230*10+41) but they are not considered equal in 1st case becoz in case of far pointers only offsets are compared i.e. it will check whether 0001==0041.... that we know is false.... and know see what will happen in case of huge.....the comparison operation is performed on absolute addresses that are equal as i already told......

3.
A far pointer is never noramlized but a huge pointer is normalized . A normalized pointer is one that has as much of the address as possible in the segment, meaning that the offset is never larger than 15.
suppose if we have 0x1234:1234 then the normalized form of it is 0x1357:0004(absolute address is 13574).......
A huge pointer is normalized only when some arithmetic operation is performed on it ... and not noramlized during assignment....

int main()
{
char huge* h=(char huge*)0x12341234;
char huge* h1=(char huge*)0x12341234;
printf("h=%Fp\nh1=%Fp",h,h1+0x1);
return 0;
}

Output:
h=1234:1234
h1=1357:0005

Explanation:
as i said above huge is not normalized in case of assignment......but if an arithmetic operation is performed on it ..... it will be normalized.... so h is 1234:1234 and h1 is 1357:0005..........that is normalized.......

4.
The offset of huge pointer is less than 16 because of normalization and not so in case of far pointers...................

lets take an example to understand what i want to say.....
int main()
{
char far* f=(char far*)0x0000000f;
printf("%Fp",f+0x1);
return 0;
}

Output:
0000:0010

in case of huge
int main()
{
char huge* h=(char huge*)0x0000000f;
printf("%Fp",h+0x1);
return 0;
}

Output:
0001:0000

Explanation:
as we increment far pointer by 1 it will be 0000:0010...... and as we increment huge pointer by 1 thn it will be 0001:0000 bcoz its offset cant be greater than 15 in other words it will be normalized............


Copied from C Stuff 

Wednesday, December 5, 2012

SSD vs HDD


This is era of the Ultrabook Laptops .. as we know in UltraBook there is no HDD like Hard Disk there is new technology Called SSD(Solid State Drive ) .. which more faster than HDD ... lets check it out ..


These days most people are buying laptops for their computing needs and you have to make the decision between getting either a Solid State Drive (SSD) or Hard Disk Drive (HDD) as the storage component. So which is best to get, a SSD or HDD?  There’s no straight forward answer to this question, each buyer has different needs and you have to evaluate the decision based on those needs, your preferences, and of course budget.  Even though the price of SSDs has been falling and right now there is a tight supply of HDD drives due to Thailand floods, the price advantage is still strongly with HDDs.  But if performance and fast bootup is your top consideration, and money is secondary, then SSD is the way to go.  We’ll make a comparison of SSD and HDD storage and go over the good, the bad and the ugly of both.
What is a SSD?
We’ll make no assumptions here and keep this article on a level that anyone can understand.  You might be shopping for a computer and simply wondering what the heck SSD actually means?  To begin, SSD stands for Solid State Drive.  You’re probably familiar with USB memory sticks, SSD can be thought of as an oversized and more sophisticated version of the humble USB memory stick.  Like a memory stick, there are no moving parts to an SSD, information is stored in microchips.  Meanwhile, a hard drive uses a mechanical arm with a read/write head to move around and read information from the right location on a storage platter.  This difference is what makes SSD so much faster.  As an analogy, what’s quicker, having to walk across the room to retrieve a book to get information or simply magically having that book open in front of you when you need it?  That’s how an HDD compares to an SSD, it simply requires more physical labor (mechanical movement) to get information.
A typical SSD uses what is called NAND-based flash memory, this is a non-volatile type of memory.  What does non-volatile mean you ask?  The simple answer is that you can turn off the disk and it won’t “forget” what was stored on it.  This is of course an essential characteristic of any type of permanent memory.  During the early days of SSD rumors floated around saying stored data would wear off and be lost after only a few years.  Today this is not true, you can read and write to an SSD all day long and the data storage integrity will be maintained for well over 200 years.  In other words, the data storage life of an SSD can outlive you!
An SSD does not have a mechanical arm to read and write data, it instead relies on an embedded processor (or “brain”) called a controller to perform a bunch of operations related to reading and writing data.  The controller is a very important factor in determining the speed of the SSD, decisions it makes related to how to store, retrieve, cache and clean up data can determine the overall speed of the drive.  We won’t get into the nitty gritty of the details for the various tasks it performs such as error correction, read and write caching, encryption and garbage collection to name a few but suffice to say, good controller technology is often what separates an excellent from simply good SSD.  An example of a fast controller today is the SandForce SATA 3.0 (6 Gb/s) SSD controller that supports up to 500 MB per second read and write speeds.
Finally, you may be wondering what an SSD looks like and how easy it is to replace a hard drive with after market.  If you look at the images below you’ll see the top and underside of a typical sized 2.5” SSD, the technology is encased inside either a plastic or metal case and so it looks like nothing more than a battery might look like:
SSD Top Side
SSD Bottom Side

The form factor of the SSD is actually the same as a regular hard drive, it comes in a standard 1.8”, 2.5” or 3.5” size that can fit into the housing and connectors for the same sized hard drives.  The connector used for these standard sizes is SATA, there are smaller SSDs available that use what’s called mini-SATA (mSATA) and fit into the mini-PCI Express slot of a laptop.
What is an HDD?
Hard Disk Drives, or HDD in techno-parlance, have been around for donkeys years relative to the technology world.  HDDs were first introduced by IBM in 1956, yes folks this is nearly 60-year old technology, thank goodness vacuum tubes for TVs didn’t last so long!  An HDD uses magnetism to store data on a rotating platter.  A read/write head floats above the spinning platter reading and writing data.  The faster the platter spins, the faster an HDD can perform, typical laptop drives today spin at either 5400 RPM (Revolutions per Minute) or 7200RPM, some server based platters can spin at up to 15,000 RPM.
The major advantage of an HDD is that it is capable of storing lots of data cheaply.  These days 1 TeraByte (1,024 gigabytes) of storage is not unusual for a laptop hard drive, and the density continues to grow.  Cost per gigabyte is only around $0.10 / GB these days for an HDD, that’s amazing when you compare it to the near $1.75 / GB cost for an SSD.  If you want cheap storage and lots of it, using a standard hard drive is definitely the more appealing way to go.
HDDs predominantly use the SATA interface.  The most common size for laptop hard drives is the 2.5” form factor while a larger 3.5” form factor is used in desktop computers.  The larger size allows for more platters inside and thus more storage capacity.  Some desktop hard drives can store up to 4TB of data! HDDs look essentially the same from the outside as an SSD, below is an example of what an HDD looks like using the Seagate Barracuda 3TB hard drive:
HDD Top Side
HDD Bottom Side

SSD Vs HDD Comparison
Now it’s time to do some comparisons and determine which might be best for  your needs, an SSD or HDD?  The best way to compare items is a table with a side by side comparison of items in which a green box indicates an advantage:
AttributeSSD (Solid State Drive)HDD (Hard Disk Drive)
Power Draw / Battery LifeLess power draw, averages 2 – 3 watts, resulting in 30+ minute battery boostMore power draw, averages 6 – 7 watts and therefore uses more battery
CostExpensive, in excess of $1.50 per gigabyteOnly around $0.10 per gigabyte, very cheap
CapacityTypically not larger than 256GB for notebook size drivesTypically 500GB – 1TB for notebook size drives
Bootup Time for Windows 7Around 22 seconds average bootup timeAround 40 seconds average bootup time
NoiseThere are no moving parts and as such no soundAudible clicks and spinning can be heard
VibrationNo vibration as there are no moving partsThe spinning of the platters can sometimes result in vibration
Heat ProducedLower power draw and no moving parts so little heat is producedHDD doesn’t produce much heat, but it will have a measurable amount more heat than an SSD due to moving parts and higher power draw
Failure RateMean time between failure rate of 2.0 million hoursMean time between failure rate of 1.5 million hours
File Copy / Write SpeedGenerally above 200 MB/s and up to 500 MB/s for cutting edge drivesThe range can be anywhere from 50 – 120MB / s
EncryptionFull Disk Encryption (FDE)Supported on some modelsFull Disk Encryption (FDE) Supported on some models
File Opening SpeedUp to 30% faster than HDDSlower than SSD
Magnetism Affected?An SSD is safe from any effects of magnetismMagnets can erase data
If we tally up the checkmarks the SSD gets 9 and HDD gets 3.  Does that mean the that an SSD is three times better than an HDD?  Not at all, it depends on your needs, the comparison here is just to lay out what the pros and cons are for each.  Here are some rules to follow in deciding which drive is best for you:
If:
  • You need lots of storage capacity, over 500GB
  • Don’t want to spend much money
  • Don’t care too much about how fast a computer boots up or opens programs then get a hard drive.
If:
  • You are willing to pay for faster performance
  • Don’t mind limited storage capacity or can work around that then get an SSD.

this Article is Copied from Storage Reviews 

Tuesday, October 23, 2012

Prime Generator


Sorry for late post i was too busy ....
this is a new problem 

Peter wants to generate some prime numbers for his cryptosystem. Help him! Your task is to generate all prime numbers between two given numbers!

Input

The input begins with the number t of test cases in a single line (t<=10). In each of the next t lines there are two numbers m and n (1 <= m <= n <= 1000000000, n-m<=100000) separated by a space.

Output

For every test case print all prime numbers p such that m <= p <= n, one number per line, test cases separated by an empty line.

Example

Input:
2
1 10
3 5

Output:
2
3
5
7

3
5




Solution :


CC Arun Kumar Gupta

import java.util.*;
public class FastestPrime
{
 public static void main (String [] args)
 {
  Scanner sc = new Scanner(System.in);
  int test_cases = sc.nextInt();
  if((test_cases <=10) && (test_cases > 0))
  {
  for(int i = 0 ; i<test_cases ; ++i)
   {
    int m = sc.nextInt();
    int n = sc.nextInt();
    if((m<= 1000000000) &&(n<=1000000000)&&(n>0)&&(m>0))
    {
    if((n-m) <= 100000)
    {
     if((m % 2) == 0)
     ++m;
     for(int j = m ; j<= n ; ++j)
     {
      NextNum(j);
      j = j+ 1;
      
     }     
    }
    }
  System.out.println(); 
   }
  }
  

 }
 static void  NextNum(int m)
 {
  int div = 3;
  int array [] = new int[1000];
  int rem  = 1 ;
  while((rem != 0) && (div <= (m/2)))
   {
    rem = m%div;
    div = div+2;
   }
  if(rem != 0)
  {
  System.out.println(m);
   }
  
 }
}



Wednesday, October 10, 2012

Webcam is not Working in Ubuntu 11.10

Hi Guys back with some new stuffs of Linux ..
this happens frequently in Ubuntu, after some of using the Ubuntu webcam does not works.
so i have solution here .
it was taken long time to me found out the solution .
this solution worked in my laptop .


sudo apt-get install v4l2ucp
sudo v4l2ucp 

then run
cheese 

it will work   

Saturday, October 6, 2012

Sync Subtitles With The Video In VLC




I can’t stress the usefulness of subtitles enough, especially when you’re watching a movie in a foreign language. I was watching Heavenly Forest, a Japanese romantic drama, a few days back. The movie was wonderful, but I wouldn’t have understood anything had it not been for those English subtitles. I even tend to use English subtitles while watchingEnglish movies, because you guys talk so fast (Americans) or so weird (British) that it’s hard for me to grasp!
Handy as they are, subtitles can turn extremely irritating if they’re out of sync with the video. They distract you, and you end up understanding even less than what you’d have without the subs. Thankfully, if you’re using VLC player to watch the videos, you can make use of a nifty feature in the program to sync the subtitle with the video! Do note that it’ll only temporarily sync the subtitles with the video, and the sync will be gone the next time you watch the video.
Anyway, lets get started with how to implement it. I’m assuming that you’ve already loaded the video and subtitle files into VLC (you can just drag them both into its interface). Now, carefully take a look at the video and the subs, and see whether the subs are lagging behind or running ahead of the video. If you’re watching a foreign movie, it may seem like a very difficult job, but just try a little hard and you should be able to make this out. For example, if you see a girl screaming and running around wildly, and the subs show “Help me! Help me!” 3 seconds after that scene, this means that the titles are 3 seconds behind the movie.
Once you’ve figured out the lag / lead of the subtitle, it’s time to sync it with the video. In VLC, navigate to Tools > Track Synchronization, where you’ll find the Subtitles/Video section. Now comes the important part – syncing the subtitle. If the subtitle is lagging behind the video, you’ve to provide a negative value to ‘Advance of subtitles over video’. Say the subs display 3 seconds after the video, the value you got to enter is –3.000 s. Note that you can adjust the sync time to upto a thousandth of a second, although adjusting to the tenths does the job in all cases. Similarly if the subtitle is ahead of the video, enter the required positive number of seconds. Hit the Refresh button at the top right corner of the window, and you should see the change immediately.

Thursday, September 27, 2012

Max gain from given stock values



Given ticker value for a stock, for next n days, given what is the max profit that you can make ?
Eg - the max profit you can make is buy at time t1 @ 5 and sell @ t2 when stock was 12, to get max Profit of 7 dollars.

time - Stock Price

t0 - 10
t1 - 5
t2 - 12
t3 - 7
t4 - 12

Also - you can only trade once i.e you can buy and sell only 1 time.

so here is the solution of that problem .that problem is nothing just think like that if we have only one day stock values so we can buy or sell on that day only , so for general we can find the for up to kth day and we can find out for the k+1'th day ..

so algo is that maintain the 3 things first two pointer of buy and sell and one pointer of minimum values .we can make it in O(n) only



Just make a new array which contains the "lookahead" view, where we can see, which potential highest value we can gaini in future.

Another array just contains the lowest value so far. When the difference between the two arrays is max, there is the buying point. Selling point is, when the falling edge of the max array is reached.

   
public void highestGain(int[] prices) {
        int[] maxPrices = new int[prices.length];
        int[] minPrices = new int[prices.length];
        maxPrices[maxPrices.length-1] = prices[prices.length-1];
        minPrices[0] = prices[0];
        for(int i = 1; i<prices.length; i++) {
            int right = prices.length-i-1;
            minPrices[i] = Math.min(minPrices[i-1], prices[i]);
            maxPrices[right] = Math.max(maxPrices[right+1], prices[right]);
        }
        System.out.println("MaxPrices: " + Arrays.toString(maxPrices));
        System.out.println("MinPrices: " + Arrays.toString(minPrices));

        // find when to buy (when the difference of min/max is highest)

        int maxDifference = maxPrices[0] - minPrices[0];
        int maxDifferencePos = 0;
        for(int i=0; i<minPrices.length; i++) {
            int difference = maxPrices[i] - minPrices[i];
            if(maxDifference < difference) {
                maxDifference = difference;
                maxDifferencePos = i;
            }
        }
        // Now find the falling edge of max prices - there was the last peak
        int sellPos = maxDifferencePos+1;
        int lastPrice = maxPrices[maxDifferencePos];
        for(; sellPos < maxPrices.length; sellPos++) {
            if(lastPrice > maxPrices[sellPos]) {
                sellPos --;
                break;
            }
        }

        System.out.println("Ideal to buy/sell: " + maxDifferencePos + ":" + sellPos);

    }






Alien Chef



A new programming Problem.....



//http://www.codechef.com/problems/DOWNLOAD

/*


The aliens living in outer space are very advanced in technology, intelligence and everything, except one, and that is Cooking. Each year they spend millions of dollars in research, to crack famous recipes prepared by humans.

Recently they came to know about Khana-Academy, a non-profit organization streaming free cooking lesson videos on earth. There are N recipes, numbered 1 to N, and the video of the ith recipe is live in the time interval [Si, Ei]. An alien can visit earth but can not survive for more than just a small moment (earth is so advanced in pollution). An alien visits the earth at an integer time t and instantly downloads the complete video of all the lessons that are live at that moment of time t and leaves earth immediately. You are given the visiting times of a small group of K aliens. Find the number of different recipes aliens can learn by watching the downloaded videos. Not just one group of aliens, there are Q such groups, so you have to find the answer for each of these Q groups.
Input

The first line has an integer N. Each of the following N lines has two integers Si Ei. The next line has an integer Q, the number of groups. Each of the following Q lines has information of a group of aliens. The first integer is K, the number of aliens in that group, followed by K integers in the same line, the integer visiting times t of the aliens.


1 ≤ N ≤ 100000 (105)

1 ≤ Q ≤ 5000 (5 103)
1 ≤ K ≤ 20
1 ≤ Si, Ei, t ≤ 1000000000 (109)
Si < Ei

Output


For each of the Q groups, output the number of different recipes that group of aliens can learn by watching the downloaded videos.

Example

Input:

4
1 4
3 10
2 6
5 8
3
1 5
2 2 6
3 1 10 9

Output:

3
4
2

Explanation:

Given videos of 4 recipes in the following closed intervals.
1. [ 1 , 4 ]
2. [ 3 , 10 ]
3. [ 2 , 6 ]
4. [ 5 , 8 ]

In the first query, only one alien arrives at t = 5 and can download 3 recipes 2, 3, 4.


In the second query, two aliens arrive at t = 2 and 6. They can learn all the 4 recipes.


In the third query, three aliens arrive at t = 1, 10 and 9. They can learn only two recipes, 1 and 2.


*/




import java.util.*;
import java.lang.*;
/*public class Array
{
int num[]  = new int[20];



}

*/
public class AlienChefs
{
static int aaa[] = new int[100000];
static int end ;
//leng = 1;
static int start ;
public static void main(String [] args)
{

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if((0<n) && (n<= 100000))
{
int a[] = new int[2*n];
int add = 10;
for(int i = 0 ; i<(2*n) ; ++i)
{
//System.out.println("Inside");

a[i] = sc.nextInt();
if( (0<a[i])&&(a[i]< 1000000000) )
{
if((i%2) == 1   )
{
//System.out.println("Inside");
if((a[i-1] > a[i]))
System.exit(0);
}

}
else 
System.exit(0);
}
int groups = sc.nextInt();
//System.out.println("********************");
//int address[] = new int[groups];
for(int i = 0 ; i< groups; ++i)
{
int count = 0 ;
int alen = 0 ;
int times = sc.nextInt();
for(int j =0 ;j<times ; j++)
{

alen = sc.nextInt();
if((0<alen)&&(alen<=20))
{
//System.out.println(alen);
count = count+ cc(a , alen);

}


}
start = end - start;
start = start +end + add ;
end = start;
aaa[start] = 1000;
System.out.println(count);

}
}

}
static int cc(int a [] , int val)
{
int count = 0 ;

for(int i = 0 ; i< a.length; i++)
{ //static int a;
int abc =0;


if((a[i] <= val)&& (val <= a[i+1] ))
{
//System.out.println("***************************************");
abc = check(aaa , i);
if( abc == 0)
{
++count;
}

}
++i;

}
//System.out.println("Count Returned :"+count);

return count;
}
static int check(int qw [], int i)
{
//System.out.println("Check Function is called ");
//System.out.println(start+":"+end);
//System.out.println("i = "+i);
for(int j = start ; j<=end ; j++)
{
if(qw[j] == i)
return 1;
}
qw[end] = i;
//System.out.println(qw[end]+"   :::::::Value Added");
++end;
return 0;

}
}


Saturday, September 15, 2012

How Many Ip Address !!!


Hi Friends new problem


Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example:
Given "25525511135",

return ["255.255.11.135", "255.255.111.35"]{hint:recursion,backtrack}


Here is the Solution ...... 
it was taken me about 5 hours to solve see !!!

//cc Arun Kumar Gupta


import java.util.*;
public class AllIpAddress
{
    public static void main (String [] args)
    {
        Scanner sc = new Scanner(System.in);
        String input = sc.next();
        int[] intArray = new int[input.length()];
        int length = input.length();

        for (int i = 0; i < input.length(); i++) {
        intArray[i] = Character.digit(input.charAt(i), 10);
        //System.out.println(intArray[i]);
        }
        int i = 0 , j = 1 , k = 2;
        AllIpAddress ip = new AllIpAddress();
        ip.Ipaddress(intArray , i , j , k , length-1);   
       
       
       
    }
    void Ipaddress(int [] intArray , int i , int j , int k , int length)
    {
        try{
        int where = 0 ,change = 0;
        int p1 =createIP( intArray , -1 , i);
        int p2 =createIP( intArray , i ,  j );
        int p3 =createIP( intArray ,  j , k );
        int p4 =createIP( intArray ,  k ,  length );
        //System.out.println("**********Garbage"+p1+"."+p2+"."+p3+"."+p4);
        //System.out.println("i = "+i+"j = "+j+"k = "+k);
        if((p1<=255)&&(p2<=255)&&(p3<=255)&&(p4<=255)&&(p4>0))
        {
            System.out.println(p1+"."+p2+"."+p3+"."+p4);
        }
        if(p4 >255)
        {
            //if(k != j)
            //++k;
            where =4;
            //System.out.println("Problem at P4");
        }
        else if(p3>255)
        {
            //if(j != i)
            //++j;
            //--k;
            where = 3;
            //System.out.println("Problem at P3");
        }
        else if(p2>255)
        {
            //++i;
            where = 2;
            //System.out.println("Problem at P2");
        }
        else if(p1>255)
        {
           
            //System.out.println("Problem at P1");
            System.exit(0);
        }
       
        if((k == length) && (j+1 == k))
        {
            //System.out.println("if((k == length) && (j+1 == k))");
            //System.out.println(i+"_"+j+"_"+k);
            ++i;
            j = i+1;
            k = j+1;
            change = 1;
            //System.out.println(i+"_"+j+"_"+k);
           
        }
        if((k == length) &&(change == 0) )
        {
            //System.out.println("if((k == length) &&(change == 0) )");
            ++j;
            k = j+1;
            change = 0;
        }
        else if(change == 0)
        {
            if( (k) < length )
            ++k;       
        }
        /*if(where ==4)
        {
            ++k;           
        }
        if(where ==3)
        {
            ++j;
            --k;
        }
        if(where ==2)
        {
            ++i;
            --j;
        }
        /*if(k==length)
        {
            --k;
            --j;
        }*/
        Ipaddress(intArray , i , j , k , length);   
        }
        catch(ArrayIndexOutOfBoundsException e){
                 //System.out.println("Exception thrown  :" + e);
                      }
    }
    static int createIP(int [] intArray , int start , int end)
        {
            //System.out.println("I am at createIP()start = "+start+"\tend = "+end);
            int val = 1 , fina = 0;
            for(int e =end ; e>start ; --e)
            {
                 fina = intArray[e]*val + fina; 
                 val = val*10;
            }
            return fina;
        }
}