Thursday, 29 May 2014

Using Facebook Graph Search in Python for extracting Page Feeds

In this example I am using Facebook Python SDK.
Download the zip file and install it to your system.

For using Facebook Graph API you need Access Token.
Facebook provides both short-term (expires in around 100 minutes) and long-term tokens (60 days).
   
You can get a temporary access token from Facebook Explorer (Don't Hesitate in taking all permissions :P)
You can check the status of the access token by clicking on the Debug Button. 

If you want to take a long-term token then you will have to create an app on Facebook. 
Go to Facebook Developers and then click on App->Create an App. Once you have created an App you will get an App ID and App Secret(Never share it). 
First you will get a short term access token for your app at Access Token Tools.
Now to get your long-term access token go to -

https://graph.facebook.com/oauth/access_token?             
    client_id=APP_ID&
    client_secret=APP_SECRET&
    grant_type=fb_exchange_token& 
    fb_exchange_token=EXISTING_ACCESS_TOKEN   

You will get a new access token that will not expire in next 60 days.

Now to get feeds from a page you need to get its page_id. To get page_id you can just search the source code of the page and you will get it in format -  "type":"ent:page","uid":344128252278047

Code to use Facebook Graph API -

import facebook
graph = facebook.GraphAPI("ACCESS TOKEN")
strr = "/v2.0/"+str(PAGE_ID)+"/feed"
profile = graph.get_object(strr)
print profile

Now profile will give you the data in JSON format
You can just use it as python dictionary and go through all the feeds.
Not all the results are shown on the first page of the results. Instead, Facebook has Pagination to move along all the result pages. 

You can just use profile as python dictionary.
Code to display few details of the feeds -

def fetch_post(data):
            post_id = str(data["id"])
            author_id = "-"
            author_name = "-"
            if("from" in data):
                author_id = str(data["from"]["id"].encode('utf-8', 'replace'))
                author_name = str(data["from"]["name"].encode('utf-8', 'replace'))
            message = "-"
            if("message" in data):
                message = str(data["message"].encode('utf-8', 'replace'))
            name = "-"
            if("name" in data):
                name = str(data["name"].encode('utf-8', 'replace'))
            caption = "-"
            if("caption" in data):
                caption = str(data["caption"].encode('utf-8', 'replace'))
            source = "-"
            if("source" in data):
                source = str(data["source"].encode('utf-8', 'replace'))
            description = "-"
            if("description" in data):
                description = str(data["description"].encode('utf-8', 'replace'))
            link = "-"
            if("link" in data):
                link = str(data["link"].encode('utf-8', 'replace'))
            cr_time = "-"
            if("created_time" in data):
                cr_time = str(data["created_time"].encode('utf-8', 'replace'))
            up_time = "-"
            if("updated_time" in data):
                up_time = str(data["updated_time"].encode('utf-8', 'replace'))
            shares = "0"
            if("shares" in data):
                shares = str(data["shares"]["count"])
            likes = "0"
            if("likes" in data):
                likes = str(len(data["likes"]["data"]))
            print "Post-ID: %s" %(post_id)
            print "Author-ID: %s Author-Name: %s" %(author_id,author_name)
            print "Message: %s" %(message)
            print "Name: %s" %(name)
            print "Caption: %s" %(caption)
            print "Source: %s" %(source)
            print "Description: %s" %(description)
            print "Link: %s" %(link)
            print "Created-Time: %s Updated-Time: %s" %(cr_time,up_time)
            print "Shares: %s" %(shares)
            print "Likes: %s" %(likes)

import facebook
graph = facebook.GraphAPI("ACCESS TOKEN")
strr = "/v2.0/"+str(PAGE_ID)+"/feed"
profile = graph.get_object(strr)

print profile
sz = len(profile["data"])
for x in range(0,sz):
        if("id" in profile["data"][x]):
                details = fetch_post(profile["data"][x])

In this way you can use Facebook Graph API for fetching posts of the Page.

Here's the output of the above program for PAGE_ID - 344128252278047 (Sachin Tendulkar)

Post-ID: 344128252278047_792267827464085
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: Great to meet a former 'India' player and a legend.
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.792251527465715.1073741827.344128252278047/792267740797427/?type=1&relevant_count=1
Created-Time: 2014-05-28T17:32:03+0000 Updated-Time: 2014-05-29T13:21:28+0000
Shares: 1138
Likes: 25
Post-ID: 344128252278047_792251544132380
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: Happy to be invited as the Goodwill Ambassador for the 35th National Games in Kerala.
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.792251527465715.1073741827.344128252278047/792251310799070/?type=1&relevant_count=1
Created-Time: 2014-05-28T16:55:58+0000 Updated-Time: 2014-05-29T13:19:01+0000
Shares: 873
Likes: 25
Post-ID: 344128252278047_792025730821628
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: Just got back from Kerala after a visit regarding our football team in the Indian Super League - Kerala Blasters. The support and enthusiasm of the fans and the leadership was wonderful. The following for the game of football in the state is phenomenal and am sure Kerala Blasters will give all the fans more reason to cheer and further enjoy the beautiful game of  football.
Name: -
Caption: -
Source: -
Description: -
Link: -
Created-Time: 2014-05-28T07:10:11+0000 Updated-Time: 2014-05-29T13:15:57+0000
Shares: 1482
Likes: 25
Post-ID: 344128252278047_791965037494364
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: People used to call me master blaster. I'm supporting Kerala Kochi team. I hope the entire Kerala will be behind our football team. That's why we thought of naming it as Kerala Blasters FC
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/791964920827709/?type=1&relevant_count=1
Created-Time: 2014-05-28T05:21:46+0000 Updated-Time: 2014-05-29T13:21:19+0000
Shares: 6729
Likes: 25
Post-ID: 344128252278047_791463707544497
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: Practice session at the Wankhede Stadium.
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/791463687544499/?type=1&relevant_count=1
Created-Time: 2014-05-27T08:22:05+0000 Updated-Time: 2014-05-29T11:42:08+0000
Shares: 2082
Likes: 25
Post-ID: 344128252278047_790873174270217
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: -
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/790873134270221/?type=1&relevant_count=1
Created-Time: 2014-05-26T06:15:29+0000 Updated-Time: 2014-05-29T11:42:15+0000
Shares: 3814
Likes: 25
Post-ID: 344128252278047_789877277703140
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: -
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/789877204369814/?type=1&relevant_count=1
Created-Time: 2014-05-24T06:27:39+0000 Updated-Time: 2014-05-29T11:42:22+0000
Shares: 4143
Likes: 25
Post-ID: 344128252278047_788296784527856
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: The first match of my career was not that great. I had sleepless nights as I had failed to score. I finally spoke to my seniors and they advised me not to take pressure and be at ease and in control of my game. That helped me score 58 in my next match. I have not forgotten that advice and share it with every youngster I meet.
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/788296561194545/?type=1&relevant_count=1
Created-Time: 2014-05-21T05:53:24+0000 Updated-Time: 2014-05-29T11:42:25+0000
Shares: 2249
Likes: 25
Post-ID: 344128252278047_787300977960770
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: http://bit.ly/1hbHmjn
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/787300941294107/?type=1&relevant_count=1
Created-Time: 2014-05-19T07:39:49+0000 Updated-Time: 2014-05-29T11:42:31+0000
Shares: 3068
Likes: 25
Post-ID: 344128252278047_786249771399224
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: British Commonwealth issues legal tender coins in honor of Sachin. View or pre-order on : www.eicgold.com
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/785889024768632/?type=1&relevant_count=1
Created-Time: 2014-05-17T05:30:00+0000 Updated-Time: 2014-05-29T06:46:33+0000
Shares: 8856
Likes: 25
Post-ID: 344128252278047_785246431499558
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: Memorable Picture
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/785237004833834/?type=1&relevant_count=1
Created-Time: 2014-05-15T05:49:20+0000 Updated-Time: 2014-05-29T11:04:28+0000
Shares: 40945
Likes: 25
Post-ID: 344128252278047_783730588317809
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: Happy Buddha Purnima.
Name: -
Caption: -
Source: -
Description: -
Link: -
Created-Time: 2014-05-14T04:00:00+0000 Updated-Time: 2014-05-29T10:26:56+0000
Shares: 722
Likes: 25
Post-ID: 344128252278047_783742051649996
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: It's about not accepting every little challenge thrown at you. Sometimes you hold back and when it's needed you go for it.
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/783738561650345/?type=1&relevant_count=1
Created-Time: 2014-05-12T06:10:17+0000 Updated-Time: 2014-05-29T06:23:06+0000
Shares: 4728
Likes: 25
Post-ID: 344128252278047_782458088445059
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: The match starts much, much earlier than the actual match.
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/782110831813118/?type=1&relevant_count=1
Created-Time: 2014-05-10T04:00:00+0000 Updated-Time: 2014-05-29T08:34:29+0000
Shares: 1867
Likes: 25
Post-ID: 344128252278047_781472771876924
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: -
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/781472655210269/?type=1&relevant_count=1
Created-Time: 2014-05-08T05:07:38+0000 Updated-Time: 2014-05-29T07:08:59+0000
Shares: 6088
Likes: 25
Post-ID: 344128252278047_781042355253299
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: http://bit.ly/1hbHmjn
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/781042131919988/?type=1&relevant_count=1
Created-Time: 2014-05-07T09:18:25+0000 Updated-Time: 2014-05-29T08:56:12+0000
Shares: 2275
Likes: 25
Post-ID: 344128252278047_780358695321665
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: http://bit.ly/1sevIqw
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/780357431988458/?type=1&relevant_count=1
Created-Time: 2014-05-06T05:30:53+0000 Updated-Time: 2014-05-28T07:33:13+0000
Shares: 5977
Likes: 25
Post-ID: 344128252278047_779887502035451
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: -
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402883266402545.98317.344128252278047/779886642035537/?type=1&relevant_count=1
Created-Time: 2014-05-05T04:39:39+0000 Updated-Time: 2014-05-27T18:33:27+0000
Shares: 874
Likes: 25
Post-ID: 344128252278047_778466455510889
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: Happy Birthday Brian!
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/778466282177573/?type=1&relevant_count=1
Created-Time: 2014-05-02T07:19:25+0000 Updated-Time: 2014-05-29T10:27:46+0000
Shares: 8878
Likes: 25
Post-ID: 344128252278047_777709918919876
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: I always had a dream to play for India but I never let it put pressure on me.
http://bit.ly/1hbHmjn
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/777699385587596/?type=1&relevant_count=1
Created-Time: 2014-05-01T05:30:00+0000 Updated-Time: 2014-05-29T11:13:00+0000
Shares: 4369
Likes: 25
Post-ID: 344128252278047_776701259020742
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: I celebrated the World Wish Day with Rahul Jediya. Rahul is getting treated for a life threatening disease at the Nair Hospital Mumbai. He wished to meet me above all things he could have asked for. I was glad to spend time with him at my house. Thank you Make-A-Wish Foundation for making his wish a reality.
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/776324329058435/?type=1&relevant_count=1
Created-Time: 2014-04-29T03:30:00+0000 Updated-Time: 2014-05-28T15:19:44+0000
Shares: 4836
Likes: 25
Post-ID: 344128252278047_776206965736838
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: SMS "Play" to 51001 or click on http://bit.ly/1pFGUhO to play and win exciting prizes everyday.
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/776206722403529/?type=1&relevant_count=1
Created-Time: 2014-04-28T05:35:20+0000 Updated-Time: 2014-05-25T03:53:55+0000
Shares: 171
Likes: 25
Post-ID: 344128252278047_776197449071123
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: Thank you Sushil Kumar. I would also want to thank everyone for their warm heartfelt wishes. They meant a lot to me. 
Name: Timeline Photos
Caption: Sachin Sir ko Janamdin ki Hardik Shubhkaamnayen. Hum sabke liye aap ek prerna hain.
Source: -
Description: -
Link: https://www.facebook.com/214438055336512/photos/a.230714137042237.49706.214438055336512/577504559029858/?type=1
Created-Time: 2014-04-28T05:06:57+0000 Updated-Time: 2014-05-27T15:29:15+0000
Shares: 211
Likes: 25
Post-ID: 344128252278047_775769199113948
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: http://bit.ly/1hbHmjn
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/775769089113959/?type=1&relevant_count=1
Created-Time: 2014-04-27T11:44:50+0000 Updated-Time: 2014-05-28T11:08:05+0000
Shares: 3602
Likes: 25
Post-ID: 344128252278047_774563225901212
Author-ID: 344128252278047 Author-Name: Sachin Tendulkar
Message: The #WeAreSachin was a fantastic initiative by Toshiba to connect with my fans and a big thanks to everyone for making me a part of this world record. Watch mosaic here: http://bit.ly/sachincollage
Name: -
Caption: -
Source: -
Description: -
Link: https://www.facebook.com/SachinTendulkar/photos/a.402901949734010.98326.344128252278047/774563172567884/?type=1&relevant_count=1
Created-Time: 2014-04-25T04:08:20+0000 Updated-Time: 2014-05-27T05:22:16+0000
Shares: 2739
Likes: 25

Monday, 25 November 2013

BigInteger Program in C++

Once I was searching for BigInteger programs in C++, then I found this one. I really don't remember the source, as I copied it then.
But now as I am using this program for many problems, I thought of adding this one as it is really good.

If you use Java or python, you will never need this program.
















// The BigInteger Ripper

#include <vector>
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
typedef long long LL;
// base and base_digits must be consistent
const int base = 1000000000;
const int base_digits = 9;

struct bigint {
    vector<int> a;
    int sign;

    bigint() :
        sign(1) {
    }

    bigint(long long v) {
        *this = v;
    }

    bigint(const string &s) {
        read(s);
    }

    void operator=(const bigint &v) {
        sign = v.sign;
        a = v.a;
    }

    void operator=(long long v) {
        sign = 1;
        if (v < 0)
            sign = -1, v = -v;
        for (; v > 0; v = v / base)
            a.push_back(v % base);
    }

    bigint operator+(const bigint &v) const {
        if (sign == v.sign) {
            bigint res = v;

            for (int i = 0, carry = 0; i < (int) max(a.size(), v.a.size()) || carry; ++i) {
                if (i == (int) res.a.size())
                    res.a.push_back(0);
                res.a[i] += carry + (i < (int) a.size() ? a[i] : 0);
                carry = res.a[i] >= base;
                if (carry)
                    res.a[i] -= base;
            }
            return res;
        }
        return *this - (-v);
    }

    bigint operator-(const bigint &v) const {
        if (sign == v.sign) {
            if (abs() >= v.abs()) {
                bigint res = *this;
                for (int i = 0, carry = 0; i < (int) v.a.size() || carry; ++i) {
                    res.a[i] -= carry + (i < (int) v.a.size() ? v.a[i] : 0);
                    carry = res.a[i] < 0;
                    if (carry)
                        res.a[i] += base;
                }
                res.trim();
                return res;
            }
            return -(v - *this);
        }
        return *this + (-v);
    }

    void operator*=(int v) {
        if (v < 0)
            sign = -sign, v = -v;
        for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
            if (i == (int) a.size())
                a.push_back(0);
            long long cur = a[i] * (long long) v + carry;
            carry = (int) (cur / base);
            a[i] = (int) (cur % base);
            //asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
        }
        trim();
    }

    bigint operator*(int v) const {
        bigint res = *this;
        res *= v;
        return res;
    }

    friend pair<bigint, bigint> divmod(const bigint &a1, const bigint &b1) {
        int norm = base / (b1.a.back() + 1);
        bigint a = a1.abs() * norm;
        bigint b = b1.abs() * norm;
        bigint q, r;
        q.a.resize(a.a.size());

        for (int i = a.a.size() - 1; i >= 0; i--) {
            r *= base;
            r += a.a[i];
            int s1 = r.a.size() <= b.a.size() ? 0 : r.a[b.a.size()];
            int s2 = r.a.size() <= b.a.size() - 1 ? 0 : r.a[b.a.size() - 1];
            int d = ((long long) base * s1 + s2) / b.a.back();
            r -= b * d;
            while (r < 0)
                r += b, --d;
            q.a[i] = d;
        }

        q.sign = a1.sign * b1.sign;
        r.sign = a1.sign;
        q.trim();
        r.trim();
        return make_pair(q, r / norm);
    }

    bigint operator/(const bigint &v) const {
        return divmod(*this, v).first;
    }

    bigint operator%(const bigint &v) const {
        return divmod(*this, v).second;
    }

    void operator/=(int v) {
        if (v < 0)
            sign = -sign, v = -v;
        for (int i = (int) a.size() - 1, rem = 0; i >= 0; --i) {
            long long cur = a[i] + rem * (long long) base;
            a[i] = (int) (cur / v);
            rem = (int) (cur % v);
        }
        trim();
    }

    bigint operator/(int v) const {
        bigint res = *this;
        res /= v;
        return res;
    }

    int operator%(int v) const {
        if (v < 0)
            v = -v;
        int m = 0;
        for (int i = a.size() - 1; i >= 0; --i)
            m = (a[i] + m * (long long) base) % v;
        return m * sign;
    }

    void operator+=(const bigint &v) {
        *this = *this + v;
    }
    void operator-=(const bigint &v) {
        *this = *this - v;
    }
    void operator*=(const bigint &v) {
        *this = *this * v;
    }
    void operator/=(const bigint &v) {
        *this = *this / v;
    }

    bool operator<(const bigint &v) const {
        if (sign != v.sign)
            return sign < v.sign;
        if (a.size() != v.a.size())
            return a.size() * sign < v.a.size() * v.sign;
        for (int i = a.size() - 1; i >= 0; i--)
            if (a[i] != v.a[i])
                return a[i] * sign < v.a[i] * sign;
        return false;
    }

    bool operator>(const bigint &v) const {
        return v < *this;
    }
    bool operator<=(const bigint &v) const {
        return !(v < *this);
    }
    bool operator>=(const bigint &v) const {
        return !(*this < v);
    }
    bool operator==(const bigint &v) const {
        return !(*this < v) && !(v < *this);
    }
    bool operator!=(const bigint &v) const {
        return *this < v || v < *this;
    }

    void trim() {
        while (!a.empty() && !a.back())
            a.pop_back();
        if (a.empty())
            sign = 1;
    }

    bool isZero() const {
        return a.empty() || (a.size() == 1 && !a[0]);
    }

    bigint operator-() const {
        bigint res = *this;
        res.sign = -sign;
        return res;
    }

    bigint abs() const {
        bigint res = *this;
        res.sign *= res.sign;
        return res;
    }

    long long longValue() const {
        long long res = 0;
        for (int i = a.size() - 1; i >= 0; i--)
            res = res * base + a[i];
        return res * sign;
    }

    friend bigint gcd(const bigint &a, const bigint &b) {
        return b.isZero() ? a : gcd(b, a % b);
    }
    friend bigint lcm(const bigint &a, const bigint &b) {
        return a / gcd(a, b) * b;
    }

    void read(const string &s) {
        sign = 1;
        a.clear();
        int pos = 0;
        while (pos < (int) s.size() && (s[pos] == '-' || s[pos] == '+')) {
            if (s[pos] == '-')
                sign = -sign;
            ++pos;
        }
        for (int i = s.size() - 1; i >= pos; i -= base_digits) {
            int x = 0;
            for (int j = max(pos, i - base_digits + 1); j <= i; j++)
                x = x * 10 + s[j] - '0';
            a.push_back(x);
        }
        trim();
    }
   
    int length(){
    int l=0,back=a.back();
    while(back){l++;back/=10;}
    l+=((a.size()-1)*base_digits);
    return l;
    }

    friend istream& operator>>(istream &stream, bigint &v) {
        string s;
        stream >> s;
        v.read(s);
        return stream;
    }

    friend ostream& operator<<(ostream &stream, const bigint &v) {
        if (v.sign == -1)
            stream << '-';
        stream << (v.a.empty() ? 0 : v.a.back());
        for (int i = (int) v.a.size() - 2; i >= 0; --i)
            stream << setw(base_digits) << setfill('0') << v.a[i];
        return stream;
    }

    static vector<int> convert_base(const vector<int> &a, int old_digits, int new_digits) {
        vector<long long> p(max(old_digits, new_digits) + 1);
        p[0] = 1;
        for (int i = 1; i < (int) p.size(); i++)
            p[i] = p[i - 1] * 10;
        vector<int> res;
        long long cur = 0;
        int cur_digits = 0;
        for (int i = 0; i < (int) a.size(); i++) {
            cur += a[i] * p[cur_digits];
            cur_digits += old_digits;
            while (cur_digits >= new_digits) {
                res.push_back(int(cur % p[new_digits]));
                cur /= p[new_digits];
                cur_digits -= new_digits;
            }
        }
        res.push_back((int) cur);
        while (!res.empty() && !res.back())
            res.pop_back();
        return res;
    }

    typedef vector<long long> vll;

    static vll karatsubaMultiply(const vll &a, const vll &b) {
        int n = a.size();
        vll res(n + n);
        if (n <= 32) {
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    res[i + j] += a[i] * b[j];
            return res;
        }

        int k = n >> 1;
        vll a1(a.begin(), a.begin() + k);
        vll a2(a.begin() + k, a.end());
        vll b1(b.begin(), b.begin() + k);
        vll b2(b.begin() + k, b.end());

        vll a1b1 = karatsubaMultiply(a1, b1);
        vll a2b2 = karatsubaMultiply(a2, b2);

        for (int i = 0; i < k; i++)
            a2[i] += a1[i];
        for (int i = 0; i < k; i++)
            b2[i] += b1[i];

        vll r = karatsubaMultiply(a2, b2);
        for (int i = 0; i < (int) a1b1.size(); i++)
            r[i] -= a1b1[i];
        for (int i = 0; i < (int) a2b2.size(); i++)
            r[i] -= a2b2[i];

        for (int i = 0; i < (int) r.size(); i++)
            res[i + k] += r[i];
        for (int i = 0; i < (int) a1b1.size(); i++)
            res[i] += a1b1[i];
        for (int i = 0; i < (int) a2b2.size(); i++)
            res[i + n] += a2b2[i];
        return res;
    }

    bigint operator*(const bigint &v) const {
        vector<int> a6 = convert_base(this->a, base_digits, 6);
        vector<int> b6 = convert_base(v.a, base_digits, 6);
        vll a(a6.begin(), a6.end());
        vll b(b6.begin(), b6.end());
        while (a.size() < b.size())
            a.push_back(0);
        while (b.size() < a.size())
            b.push_back(0);
        while (a.size() & (a.size() - 1))
            a.push_back(0), b.push_back(0);
        vll c = karatsubaMultiply(a, b);
        bigint res;
        res.sign = sign * v.sign;
        for (int i = 0, carry = 0; i < (int) c.size(); i++) {
            long long cur = c[i] + carry;
            res.a.push_back((int) (cur % 1000000));
            carry = (int) (cur / 1000000);
        }
        res.a = convert_base(res.a, 6, base_digits);
        res.trim();
        return res;
    }
};


void recursive_fraction(bigint a,bigint b)
{
  bigint n,i;
  if(a>b)
  {
    n=a/b;
    for(i=1;i<=n;i+=1)
    {
       cout<<"1 ";
    }
    a=(a-b*n);
  }
  while(a!=0)
  {
    n=b/a;
    if(b%a!=0) n=n+1;
    cout<<n<<" ";
    a=n*a-b;
    b=n*b;
  }
}
int main()
{
 while(true)
 {
      bigint num;
      cin>>num;
      if(num == -1)break;
      bigint nine = 9;
      bigint ans = num/nine;
      bigint zero = 0;
      if(num%nine != zero)
             ans = ans + 1;
      cout<<ans<<endl;
 }
  return 0;
}


PS: (My implementation of Biginteger add, multiply and subtraction, just coded it once in the beginning)

// My Implementation

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
typedef long long int int64;
using namespace std;
char op1[100001],op2[100001],res[200003];

char * convert(int64 a,char * num)
{
     int len = int(log10(double(a)));
     num[len+1] = '\0';
     while(a>0)
     {
      num[len--] = a%10 + '0';
      a = a/10;        
     }
     return num;
}

char * convert(char * a,char * num)
{
     strcpy(num,a);
     return num;
}

char * reverse(char * num)
{
 char x[200003];int lo = 0;
 int len = strlen(num);
 while(num[len-1]=='0' && len>=1)
                       len--;

 if(len==0)
           {num[0]='0';num[1]='\0';return num;}

 for(int xx = len-1;xx>=0;xx--)
 {
         x[lo++] = num[xx];
 }  
 x[lo]='\0';
 strcpy(num,x);
 return num;
}

char * add(char * a, char * b, char * num)
{
     int len1 = strlen(a)-1;
     int len2 = strlen(b)-1;
     int carry = 0;
     int x = 0;
     while(len1>=0 && len2>=0)
     {
      int temp = a[len1--]-'0'+ b[len2--]-'0' + carry;            
      num[x++] = temp%10 + '0';
      carry = temp/10;
     }   
     while(len1>=0)
     {
      int temp = a[len1--]-'0'+ carry;            
      num[x++] = temp%10 + '0';
      carry = temp/10;
     }
     while(len2>=0)
     {
      int temp = b[len2--]-'0'+ carry;            
      num[x++] = temp%10 + '0';
      carry = temp/10;
     }
     if(carry>0)
                num[x++] = carry+'0';
     num[x] = '\0';   
     return reverse(num);
}

char * sub(char * a, char * b, char * num)
{
     int len1 = strlen(a)-1;
     int len2 = strlen(b)-1;
     int carry = 0;
     int x = 0;int togl = 0;
     while(len2>=0)
     {
      int temp;
      if(a[len1]>=b[len2])
      {
       temp = a[len1] - b[len2];
       num[x++] = temp + '0';                   
       len1--,len2--;
      }
      else
      {
       int flag;togl = 1;
       while(a[len1]<=b[len2])
       {
        if(togl==1){num[x++] = a[len1] - b[len2]+10 +'0';togl=0;}
        else {num[x++] = a[len1] - b[len2]+9 +'0';}
        len1--,len2--;            
        if(len2<0)
                  {flag=1;break;} 
       }  
       while(a[len1]=='0'){num[x++]='9';len1--;}
       num[x++] =    a[len1] - (flag==1?'0':b[len2]) - 1 +'0';
       len2--,len1--;
      }            
     }
     while(len1>=0)
                   num[x++]=a[len1--];
     num[x]= '\0';

     return reverse(num);
}


char * mult(char * a, char * b, char * num)
{
     int len1 = strlen(a)-1;
     int len2 = strlen(b)-1;
     int x=0,carry=0,ll=0,mm=0,prevll=-1;
     for(int i=len1;i>=0;i--)
     {
      int mul1 = a[i]-'0';
      for(int j=len2;j>=0;j--)      
             {
                int mul2 = b[j]-'0';          
                int temp = mul1*mul2 + carry + (mm<=prevll?num[mm]-'0':0);
                num[mm++] = temp%10 +'0';
                carry = temp/10;                                    
             }
             if(carry>0)
                        {num[mm++]=carry+'0';
                         carry = 0;}
             prevll = mm-1;
             ll++;
             if(i==0){num[mm]='\0';break;}
             mm = ll;
     }
     return reverse(num);
}



int main()
{
 char a[100001], b[100001];
 while(cin>>a>>b)
 {
  //cout<<add(convert(a,op1),convert(b,op2),res)<<endl;
  cout<<sub(convert(a,op1),convert(b,op2),res)<<endl;
  //cout<<mult(convert(a,op1),convert(b,op2),res)<<endl; 
 
 }
return 0;
}