import java.util.*;
class Quersumme
{
static List<Long> list = new ArrayList<Long>();
public static void main(String args[])
{
initValues();
for (int i=0; i<list.size(); i++)
{
int n=1000000;
test1(n, list.get(i));
test2(n, list.get(i));
}
}
private static void initValues()
{
String s = "12";
int n = 3;
do
{
long value = Long.parseLong(s);
if (value > Long.MAX_VALUE / 10 - 1)
{
break;
}
list.add(value);
s += n;
n = (n+1) % 10;
} while (true);
}
public static void test1(int n, long value)
{
long before = System.currentTimeMillis();
long sum = 0;
for (int i = 0; i < n; i++)
{
sum += Quersumme.quersummeCharArray(value);
}
long after = System.currentTimeMillis();
System.out.println("test1 value "+value+" sum "+sum+" time "+(after-before));
}
static long quersummeCharArray(long zahl)
{
long summe = 0;
char[] arr = String.valueOf(zahl).toCharArray();
for (char element : arr) {
summe += element - '0';
}
return summe;
}
public static void test2(int n, long value)
{
long before = System.currentTimeMillis();
long sum = 0;
for (int i = 0; i < n; i++)
{
sum += Quersumme.checksum(value);
}
long after = System.currentTimeMillis();
System.out.println("test2 value "+value+" sum "+sum+" time "+(after-before));
}
private static int d[];
private static void init()
{
d = new int[100];
for (int i=0; i<100; i++)
{
d[i] = i/10+i%10;
}
}
static long checksum(long value)
{
if (d==null) init();
long q, sum = 0;
int q2, r;
while (value > Integer.MAX_VALUE)
{
q = value / 100;
r = (int)(value - ((q << 6) + (q << 5) + (q << 2)));
value = q;
sum += d[r];
}
int value2 = (int)value;
while (value2 >= 65536)
{
q2 = value2 / 100;
r = value2 - ((q2 << 6) + (q2 << 5) + (q2 << 2));
value2 = q2;
sum += d[r];
}
while (true)
{
q2 = (value2 * 52429) >>> (16+3);
r = value2 - ((q2 << 3) + (q2 << 1));
sum += d[r];
value2 = q2;
if (value2 == 0)
{
break;
}
}
return sum;
}
}