Problem: A dial lock is a kind of lock which has some dials with printed numbers. It has a special sequence of numbers, namely an unlocking sequence, to be opened.

You are working at a manufacturer of dial locks. Your job is to verify that every manufactured lock is unlocked by its unlocking sequence. In other words, you have to rotate many dials of many many locks.

It’s a very hard and boring task. You want to reduce time to open the locks. It’s a good idea to rotate multiple dials at one time. It is, however, a difficult problem to find steps to open a given lock with the fewest rotations. So you decided to write a program to find such steps for given initial and unlocking sequences.

Your company’s dial locks are composed of vertically stacked k (1 ≤ k ≤ 10) cylindrical dials. Every dial has 10 numbers, from 0 to 9, along the side of the cylindrical shape from the left to the right in sequence. The neighbor on the right of 9 is 0.

A dial points one number at a certain position. If you rotate a dial to the left by i digits, the dial newly points the i-th right number. In contrast, if you rotate a dial to the right by i digits, it points the i-th left number. For example, if you rotate a dial pointing 8 to the left by 3 digits, the dial newly points 1.

You can rotate more than one adjacent dial at one time. For example, consider a lock with 5 dials. You can rotate just the 2nd dial. You can rotate the 3rd, 4th and 5th dials at the same time. But you cannot rotate the 1st and 3rd dials at one time without rotating the 2nd dial. When you rotate multiple dials, you have to rotate them to the same direction by the same digits.

Your program is to calculate the fewest number of rotations to unlock, for given initial and unlocking sequences. Rotating one or more adjacent dials to the same direction by the same digits is counted as one rotation.



Input

The input consists of multiple datasets. Each datset consists of two lines. The first line contains an integer k. The second lines contain two strings, separated by a space, which indicate the initial and unlocking sequences.

The last dataset is followed by a line containing one zero. This line is not a part of any dataset and should not be processed.

Output

For each dataset, print the minimum number of rotations in one line.

Example

Input

4
1357 4680
6
777777 003330
0


Output

1
2

Solution (in CPP):

Solution:
                            #include <bits/stdc++.h>
                            #include<iostream>
                            #include<cstdio>
                            #include<vector>
                            #include<queue>
                            #include<map>
                            #include<cstring>
                            #include<string>
                            #include <math.h>
                            #include<algorithm>
                        //    #include <boost/multiprecision/cpp_int.hpp>
                            #include<functional>
                    #define int long long
                            #define inf  1000000007
                            #define pa pair<int,int>
                            #define ll long long
                            #define pal pair<double,pa>
                            #define ppa pair<int,int>
                            #define ppap pair<int,pa>
                            #define ssa pair<string,int>
                            #define  mp make_pair
                            #define  pb push_back
                            #define EPS (1e-10)
                            #define equals(a,b) (fabs((a)-(b))<EPS)
                     
                            using namespace std;
                  
                            class Point{
                            	public:
                            	double x,y;
                            	Point(double x=0,double y=0):x(x),y(y) {}
                            	Point operator + (Point p) {return Point(x+p.x,y+p.y);}
                            	Point operator - (Point p) {return Point(x-p.x,y-p.y);}
                            	Point operator * (double a) {return Point(x*a,y*a);}
                            	Point operator / (double a) {return Point(x/a,y/a);}
                            	double absv() {return sqrt(norm());}
                            	double norm() {return x*x+y*y;}
                            	bool operator < (const Point &p) const{
                            		return x != p.x ? x<p.x: y<p.y;
                            	}
                            	bool operator == (const Point &p) const{
                            		return fabs(x-p.x)<EPS && fabs(y-p.y)<EPS;
                            	}
                            };
                            typedef Point Vector;
                     
                            struct Segment{
                            Point p1,p2;
                            };
                             double dot(Vector a,Vector b){
                            	return a.x*b.x+a.y*b.y;
                            }
                            double cross(Vector a,Vector b){
                            	return a.x*b.y-a.y*b.x;
                            }
                        
bool parareru(Point a,Point b,Point c,Point d){
//	if(abs(cross(a-b,d-c))<EPS)cout<<"dd "<<cross(a-b,d-c)<<endl;
	return abs(cross(a-b,d-c))<EPS;
}
double distance_ls_p(Point a, Point b, Point c) {
  if ( dot(b-a, c-a) < EPS ) return (c-a).absv();
  if ( dot(a-b, c-b) < EPS ) return (c-b).absv();
  return abs(cross(b-a, c-a)) / (b-a).absv();
}
bool is_intersected_ls(Segment a,Segment b) {
	if(a.p1==b.p1||a.p2==b.p1||a.p1==b.p2||a.p2==b.p2) return false;
	if(parareru((a.p2),(a.p1),(a.p1),(b.p2))&&parareru((a.p2),(a.p1),(a.p1),(b.p1))){
//		cout<<"sss"<<endl;
		if(dot(a.p1-b.p1,a.p1-b.p2)<EPS) return true;
		if(dot(a.p2-b.p1,a.p2-b.p2)<EPS) return true;
		if(dot(a.p1-b.p1,a.p2-b.p1)<EPS) return true;
		if(dot(a.p1-b.p2,a.p2-b.p2)<EPS) return true;
		return false;
	}
  else return ( cross(a.p2-a.p1, b.p1-a.p1) * cross(a.p2-a.p1, b.p2-a.p1) < EPS ) && ( cross(b.p2-b.p1, a.p1-b.p1) * cross(b.p2-b.p1, a.p2-b.p1) < EPS );
}

double segment_dis(Segment a,Segment b){
	if(is_intersected_ls(a,b))return 0;
	double r=distance_ls_p(a.p1, a.p2, b.p1);
	r=min(r,distance_ls_p(a.p1, a.p2, b.p2));
	r=min(r,distance_ls_p(b.p1, b.p2, a.p2));
	r=min(r,distance_ls_p(b.p1, b.p2, a.p1));
	return r;
}
Point intersection_ls(Segment a, Segment b) {
  Point ba = b.p2-b.p1;
  double d1 = abs(cross(ba, a.p1-b.p1));
  double d2 = abs(cross(ba, a.p2-b.p1));
  double t = d1 / (d1 + d2);

  return a.p1 + (a.p2-a.p1) * t;
}

                string itos( int i ) {
                ostringstream s ;
                s << i ;
                return s.str() ;
                }
                 
                int gcd(int v,int b){
                	if(v>b) return gcd(b,v);
                	if(v==b) return b;
                	if(b%v==0) return v;
                	return gcd(v,b%v);
                }
 
                double distans(double x1,double y1,double x2,double y2){
                	double rr=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
                	return sqrt(rr);
                	
                }
                /*
int pr[100010];
//int inv[100010];
*/ 
int beki(int wa,int rr,int warukazu){
	if(rr==0) return 1ll;
	if(rr==1) return wa%warukazu;
	if(rr%2==1) return (beki(wa,rr-1,warukazu)*wa)%warukazu;
	int zx=beki(wa,rr/2,warukazu);
	return (zx*zx)%warukazu;
}
  /*
void gya(){
	pr[0]=1;
	for(int i=1;i<100010;i++){
		pr[i]=(pr[i-1]*i)%inf;
	}
	for(int i=0;i<100010;i++) inv[i]=beki(pr[i],inf-2);
	
}

*/

                         //----------------kokomade tenpure------------

queue<ppa> qu;
int sto(string s){
	int l=s.length();
	int g=0;
	for(int i=0;i<l;i++){
		g *=10;
		g += s[i]-'0';
	}
	return g;
}
signed main(){
	
	
	while(1){
		int n;
		cin>>n;
	//	cout<<n<<endl;
		if(n==0) return 0;
		string s,t;
		cin>>s>>t;
		while(qu.size()>0)qu.pop();
		string w="";
		for(int i=0;i<n;i++) w+="0";
		for(int i=0;i<n;i++){
			w[i] += (10+(t[i]-s[i]))%10;
		}
		
	//	cout<<sto(w)<<endl;
		if(sto(w)==0){
			cout<<0<<endl;
			
		}
		else{
			
			while(w[0]=='0') w=w.substr(1);
		
			qu.push(mp(sto(w),0));
			while(1){
				ppa z=qu.front();
				qu.pop();
				int uu=z.first;
			//	cout<<"u"<<endl;
				if(uu==0){
					cout<<z.second<<endl;
					break;
				}
			//	while(u[0]=='0') u=u.substr(1);
				string u=itos(uu);
				int l=u.length();
			//	bool b=true;
			//	for(int i=1;i<u.length();i++)if(u[i]!=u[0])b=false;
			//	if(b){
			//		cout<<z.second+1<<endl;
			//		break;
			//	}
			
				for(int i=0;i<u.length();i++){
				
					string a=u;
					for(int j=0;j<=i;j++){
						a[j] -= u[0]-'0';
						if(a[j]<'0') a[j] +=10;
					}
				if(sto(a)==0){
					cout<<z.second+1<<endl;
					goto lll;
				}
			//	while(a[0]=='0') a=a.substr(1);
		//		cout<<w<<" "<<a<<endl;
				qu.push(mp(sto(a),z.second+1));
				}
			
			
			}
			lll:;
		}
		
	}
	
	return 0;
}