Created
March 12, 2012 09:29
-
-
Save adevtus/2020902 to your computer and use it in GitHub Desktop.
Lucky Numbers - C# - Interview Street
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
class ProgramBun | |
{ | |
static int[] Primes = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, | |
97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, | |
193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, | |
307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, | |
421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, | |
547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, | |
659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, | |
809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, | |
941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, | |
1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, | |
1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, | |
1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, | |
1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, | |
1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, | |
1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, | |
1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999}; | |
public static void Main(String[] args) | |
{ | |
int noTestCases; | |
string line = Console.ReadLine(); | |
Int32.TryParse(line, out noTestCases); | |
//string line = ""; | |
ulong[] minvalues = new ulong[noTestCases]; | |
ulong[] maxvalues = new ulong[noTestCases]; | |
int[] results = new int[noTestCases]; | |
ulong maxMaxValue = 0; | |
for (int i = 0; i < noTestCases; i++) | |
{ | |
line = Console.ReadLine(); | |
string[] values = line.Split(); | |
ulong.TryParse(values[0], out minvalues[i]); | |
ulong.TryParse(values[1], out maxvalues[i]); | |
if (maxvalues[i] > maxMaxValue) maxMaxValue = maxvalues[i]; | |
} | |
//int maxPrime = (int)Math.Round((Math.Log10(maxMaxValue) + 1) * 81); | |
//bool[] Sieve = new bool[maxPrime]; | |
//Sieve[0] = false; | |
//Sieve[1] = false; | |
//for (int i = 2; i < Sieve.Length; i++) | |
//{ | |
// Sieve[i] = true; | |
//} | |
//for (int i = 2; i <= Sieve.Length / 2; i++) | |
//{ | |
// if(Sieve[i] == true) | |
// for (int j = 2; (j * i) < Sieve.Length; j++) | |
// { | |
// Sieve[j * i] = false; | |
// } | |
//} | |
//for(int i = 0; i<Sieve.Length; i++) | |
// if(Sieve[i] == true) | |
// Console.Write(i + " "); | |
int count = 0; | |
while (count < noTestCases) | |
{ | |
int luckyNumbers = 0; | |
int partSum = 0; | |
int partSumSq = 0; | |
while (minvalues[count] <= maxvalues[count]) | |
{ | |
if (minvalues[count] > 9 && (partSum == 0 || minvalues[count] % 10 == 0)) | |
{//if there's no partial sum or we've reached another cycle | |
//Console.WriteLine("ding" + minvalues[count]); | |
partSum = 0; | |
partSumSq = 0; | |
ulong temp = minvalues[count]; | |
temp /= 10;//last digit is ignored | |
while (temp != 0)//calculate partial sum of digits | |
{ | |
byte digit = (byte)(temp % 10); | |
partSum += digit; | |
partSumSq += (int)(digit * digit); | |
temp /= 10; | |
} | |
} | |
//same for partial sum of squares | |
//partSum += (int)minvalues[count] % 10; | |
//partSumSq += (int)(minvalues[count] % 10) * (int)(minvalues[count] % 10); | |
int lastDigit = (int)minvalues[count] % 10; | |
if (Primes.Contains(partSum + lastDigit) && | |
Primes.Contains(partSumSq + lastDigit * lastDigit)) | |
{ | |
luckyNumbers++; | |
} | |
minvalues[count]++; | |
} | |
results[count] = luckyNumbers; | |
count++; | |
} | |
for (int i = 0; i < results.Length; i++) | |
{ | |
Console.WriteLine(results[i]); | |
} | |
} | |
} |
Code works but is a mess and poorly commented, sorry about that, will post a better version IF I can find a way to optimize it
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A number is called lucky if the sum of its digits, as well as the sum of the squares of its digits is a prime number. How many numbers between A and B are lucky?
Input:
The first line contains the number of test cases T. Each of the next T lines contains two integers, A and B.
Output:
Output T lines, one for each case containing the required answer for the corresponding case.
Constraints:
1 <= T <= 10000
1 <= A <= B <= 10^18
Sample Input:
2
1 20
120 130
Sample Output:
4
1
Explanation:
For the first case, the lucky numbers are 11, 12, 14, 16.
For the second case, the only lucky number is 120.