2011年1月29日土曜日

ProjectEulerを斬る!問12

Problem 12
08 March 2002

The sequence of triangle numbers is generated by adding the natural numbers. So the 7^(th) triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be:

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

Let us list the factors of the first seven triangle numbers:

1: 1
3: 1,3
6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28

We can see that 28 is the first triangle number to have over five divisors.

What is the value of the first triangle number to have over five hundred divisors?

三角数数列は自然数を足し加えることで作り出すことができます。
なので、7つ目の三角数は1 + 2 + 3 + 4 + 5 + 6 + 7 = 28となります。
最初の10つの三角数数列は1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...のようになります。

では、最初の7つの三角数の約数を見ていきましょう。
1: 1
3: 1,3
6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28
上からもわかるように、三角数で最初に約数の数が5つを超えるものは28です。
では最初に500つの約数を超える三角数はいくつでしょうか。(日本語訳PNN)




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int tri = 0;
int n_fact = 0;
for (int i = 1; n_fact <= 500; i++)
{
tri += i;
n_fact = 2;
for (int j = 2; j <= Math.Sqrt(tri); j++)
{
if ((int)(tri / j) * j == tri)
{
n_fact += 2;
}
}
}
Console.WriteLine(tri);
Console.ReadLine();
}
}
}

出力結果:76576500
↑ちょっと面白い数字

ProjectEulerを斬る!問11

Problem 11
22 February 2002

In the 20×20 grid below, four numbers along a diagonal line have been marked in red.

08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48

The product of these numbers is 26 × 63 × 78 × 14 = 1788696.

What is the greatest product of four adjacent numbers in any direction (up, down, left, right, or diagonally) in the 20×20 grid?

下も20*20の格子を示しました。4つの同一斜線部分の数字を赤で示しています。
これらの数字の積は26 × 63 × 78 × 14 = 1788696です。
どのような方向(縦、横、斜め)でもよいので、この20*20の格子の中で隣り合う4つの数字の積のなかで、最も大きくなるものを求めなさい。(日本語訳PNN)




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string note;
note = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 ";
note += "49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 ";
note += "81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 ";
note += "52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 ";
note += "22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 ";
note += "24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 ";
note += "32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 ";
note += "67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 ";
note += "24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 ";
note += "21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 ";
note += "78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 ";
note += "16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 ";
note += "86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 ";
note += "19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 ";
note += "04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 ";
note += "88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 ";
note += "04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 ";
note += "20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 ";
note += "20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 ";
note += "01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 ";

int[,] grid = new int[20,20];
for (int i = 0; i<= 19; i++)
{
for (int j = 0; j <= 19; j++)
{
grid[j,i] = int.Parse(note.Substring(j*3 + i*60, 2));
}
}

int max = 0;
int cal = 0;
for (int i = 0; i <= 19; i++)
{
for (int j = 0; j <= 19; j++)
{
if (19 - j - 3 >= 0)
{
cal = grid[j, i] * grid[j + 1, i] * grid[j + 2, i] * grid[j + 3, i];
if (cal >= max)
{
max = cal;
}
}
if (19 - i - 3 >= 0)
{
cal = grid[j, i] * grid[j, i + 1] * grid[j, i + 2] * grid[j, i + 3];
if (cal >= max)
{
max = cal;
}
}
if (19 - i - 3 >= 0 && 19 - j - 3 >= 0)
{
cal = grid[j, i] * grid[j + 1, i + 1] * grid[j + 2, i + 2] * grid[j + 3, i + 3];
if (cal >= max)
{
max = cal;
}
}
if (19 - i - 3 >= 0 && j >= 3)
{
cal = grid[j, i] * grid[j -1, i + 1] * grid[j - 2, i + 2] * grid[j - 3, i + 3];
if (cal >= max)
{
max = cal;
}
}
}
}
Console.WriteLine(max);
Console.ReadLine();
}
}
}

出力結果:70600674

ProjectEulerを斬る!問10

Problem 10
08 February 2002

The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.

Find the sum of all the primes below two million.

10までの素数の総和は2+3+5+7=17です。
2000000までの素数の総和を求めなさい。(日本語訳PNN)




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double sum = 2;
int req = 2000000;

for (double prime = 3; prime <= req; prime += 2)
{
bool b_prime = true;
if ((int)(prime / 2) * 2 == prime)
{
b_prime = false;
}
else
{
for (double i = 3; i <= Math.Sqrt(prime); i += 2)
{
if ((int)(prime / i) * i == prime)
{
b_prime = false;
break;
}
}
}
if (b_prime == true)
{
sum += prime;
}
}
Console.WriteLine(sum);
Console.ReadLine();
}
}
}

出力結果:142913828922

ProjectEulerを斬る!問9

Problem 9
25 January 2002

A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,
a^(2) + b^(2) = c^(2)

For example, 3^(2) + 4^(2) = 9 + 16 = 25 = 5^(2).

There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc.

ピタゴラス数の3つの組というものはa<b<cが成り立っていてかつa^2+b^2=c^2が成り立っている3つの数字の組を言います。
例えば、 3^2 + 4~2=9+16=25=5^2
a+b+c=1000を満たすピタゴラス数の3つの組が存在します。そのabcの積を求めなさい。
(日本語訳PNN)




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 0;
int b = 0;
int c = 0;
for (int n = 2; a + b + c != 1000; n ++)
{
for (int m = 1; m < n; m ++)
{
//nとmが互いに素かどうかを確かめる
bool b_coprime = true;
if ((int)(n / 2) * 2 == n && (int)(m / 2) * 2 == m)
{
b_coprime = false;
}
else
{
int p = m;
if ((int)(m / 2) * 2 == m)
{
for (int q = m; (int)(p / 2) * 2 == p;)
{
p /= 2;
}
}
for (int q = 3; q <= p; q += 2)
{
if ((int)(p/q)*q==p&&(int)(n/q)*q==n)
{
b_coprime = false;
}
}
}
/*確認
if (b_coprime == true)
{
Console.WriteLine(n.ToString() + "," + m.ToString() + ":" + b_coprime);
Console.ReadLine();
}*/

//mとnが同時に偶数、奇数である場合は計算しない
bool b_nm_oe = false;
if ((int)(n / 2) * 2 == n && (int)(m / 2) * 2 == m)
{
b_nm_oe = true;
}
if ((int)(n / 2) * 2 != n && (int)(m / 2) * 2 != m)
{
b_nm_oe = true;
}

if (b_coprime == true && b_nm_oe == false)
{
a = n * n - m * m;
b = 2 * n * m;
c = n * n + m * m;
Console.WriteLine(a.ToString() + "," + b.ToString() + "," + c.ToString() + ":" + (a + b + c).ToString());
Console.ReadLine();
}
}
}
Console.WriteLine(a * b * c);
}
}
}


???出てこないぞー、互いに素を求めるアルゴリズムは結構工夫したぞー。なんでかな~なんでかな~
なんかすっごく嫌な予感がするな~怖いな~やだな~
なんて思ったので組みなおしてみた。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 0; int b = 0; int c = 0;
int req = 1000;
bool ans = false;
for (int i = 1; i <= req; i++)
{
for (int j = i + 1; j <= req; j++)
{
int k = req - i - j;
if (i * i + j * j == k * k)
{
if (i + j + k == req)
{
a = i; b = j; c = k;
ans = true;
}
break;
}
if (j > k)
{
break;
}
}
}
Console.WriteLine(a.ToString()+","+b.ToString()+","+c.ToString());
Console.WriteLine((a*b*c).ToString());
Console.ReadLine();
}
}
}

出力結果:31875000

結果的に言えば、互いに素とかややこしい事は一切考える必要はなかった。
というのは、この積が出るときのピタゴラス数が、200、375、425なのだ。
見た瞬間5が公約数にあることがわかる。

互いに素判定アルゴリズムなんていらんかったんや・・・
はあ、なんか疲れてきたけど、まあ、このアルゴリズムもいつかは役に立つだろう!
ポジティブポジティブwww

2011年1月28日金曜日

ProjectEulerを斬る!問8

Find the greatest product of five consecutive digits in the 1000-digit number.

73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

下の1000桁の数字の中から、5つの連続した数字の最も大きな積を見つけなさい。
(日本語訳PNN)




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string q = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
int max = 0;
int p = 0;
for (int i = 1; i <= q.Length - 5; i++ )
{
p = 1;
for (int j = 0; j <= 4; j++)
{
p = p * int.Parse(q.Substring(i + j,1));
Console.Write(p.ToString() + "*");
}
Console.WriteLine();
if (p >= max)
{
max = p;
}
}
Console.WriteLine(max);
Console.ReadLine();
}
}
}

出力結果:40824

ProjectEulerを斬る!問7

Problem 7
28 December 2001

By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6^(th) prime is 13.

What is the 10001^(st) prime number?

最初の6つの素数をリストアップしてみると2,3,5,7,11,13となり、6番目の素数は13であることがわかります。
では10001番目の素数はいくつでしょうか。



これは結構処理に時間が掛かりそうですから、余計な演算を出来る限るそぎとる感じで行きましょう。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int num = 2;
double prime = 0;
for (double i = 3; num <= 10001; i += 2)
{
bool b_prime = true;
for (double j = 3; j <= Math.Sqrt(i); j += 2)
{
if (Math.Floor(i / j) == Math.Ceiling(i / j))
{
b_prime = false;
break;
}
}
if (b_prime==true)
{
prime = i;
num ++;
}
}
Console.WriteLine(prime);
Console.ReadLine();
}
}
}


出力結果:104743

意外に時間はかからなかった。

ProjectEulerを斬る!問6

The sum of the squares of the first ten natural numbers is,
1^(2) + 2^(2) + ... + 10^(2) = 385

The square of the sum of the first ten natural numbers is,
(1 + 2 + ... + 10)^(2) = 55^(2) = 3025

Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 - 385 = 2640.

Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.

最初の10つの自然数の平方の和は
1^2 + 2^2 + ....+10^2 =385
最初の10つの自然数の和の平方は
(1+2....+10)^2 = 3025
故に、最初の10つの自然数の平方の和と、和の平方の差は
3025-385=2640となります。
では最初の100つの自然数の平方の和と和の平方の差はいくらになるでしょう。
��日本語訳PNN)



簡単すぎw

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double suma = 0;
double sumb = 0;
for (int i = 1; i <= 100; i++)
{
suma += i * i;
sumb += i;
}
sumb = sumb * sumb;
Console.WriteLine(Math.Abs(suma - sumb));
Console.ReadLine();
}
}
}

出力結果:25164150

ProjectEulerを斬る!問5

Problem 5
30 November 2001

2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

2520は1から10の整数全てで割り切れる最小の数です。(つまり最小公倍数)
では1から20の整数全てで割り切れる最小の数は幾つでしょう。
��日本語訳PNN)




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/*
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
*/
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 20;

//2-20までの素数表作成
int yousosu = 2;
bool b_sosu = true;
int[] sosu = new int[2];
sosu[0] = 2;
sosu[1] = 3;
for (int i = 5; i <= a; i += 2)
{
int k = 0;
for (int j = 1; j <= yousosu - 1; j++)
{
if ((int)(i / sosu[j]) * sosu[j] == i)
{
b_sosu = false;
}
k = j;
}
if (b_sosu != false)
{
for (int j = sosu[k]; j <= Math.Sqrt(a); j += 2)
{
if ((int)(i / j) * j == i)
{
b_sosu = false;
}
}
}
if (b_sosu == true)
{
sosu.CopyTo(sosu = new int[yousosu+1],0);
sosu[yousosu] = i;
yousosu++;
}
else
{
b_sosu = true;
}
}

/*きちんと素数配列が出来ているかの✔
for (int i = 0; i <= yousosu -1; i++)
{
Console.WriteLine(sosu[i]);
}
Console.ReadLine();
*/

//最小公倍数を求める
int[,] yakusu = new int[21,21];
for (int i = 2; i <= a; i++)
{
int b = i;
for (int j = 0; j <= yousosu - 1; j++)
{
for (int k = 0; k >= 0; k = k)
{
if ((int)(b / sosu[j]) * sosu[j] == b)
{
yakusu[i, j]++;
b = b / sosu[j];
}
else
{
break;
}
}
if (b == 1)
{
break;
}

}
}
/*きちんと分配出来てるか確認
for (int i = 2; i <= a; i++)
{
Console.Write(i.ToString() + " : ");
for (int j = 0; j <= yousosu - 1; j++)
{
Console.Write(yakusu[i, j].ToString() + ",");
}
Console.Write("\n");
}
Console.ReadLine();*/

int[] max = new int[yousosu];
for (int i = 0; i <= yousosu - 1; i++)
{
for (int j = 2; j <= a; j++)
{
if (yakusu[j, i] >= max[i])
{
max[i] = yakusu[j, i];
}
}
}
/*確認*/
int kekka = 1;
for (int i = 0; i <= yousosu-1; i++)
{
kekka = kekka * (int)Math.Pow(sosu[i],max[i]);
}
Console.WriteLine(kekka);
Console.ReadLine();
}
}
}


出力結果:232792560
まず最初に1から20までの素数表の作成をして、すると1から20までの数字は必ずその素数の乗数の積で表されます。最小公倍数は、その各々の素数の乗数の最も大きい物の積でありますからそれで計算しています。

次の画像を見てください。
無題

つまり出力結果の232792560=2^4 * 3~2 * 5 * 7 * 11 * 13 * 17 * 19ということです。

ProjectEulerを斬る!問4

Problem 4
16 November 2001

A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.

Find the largest palindrome made from the product of two 3-digit numbers.

ある回文数は前から読んでも後ろから読んでも同じ数です。(例:13531とか169961)wiki
2桁の数字の積で一番大きくなる回文数は9009で91*99。
では3桁の数字の積で一番大きくなる回文数を求めましょう。(日本語訳PNN)




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/*
Problem 4
16 November 2001

A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.

Find the largest palindrome made from the product of two 3-digit numbers.
*/
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double a = 999;
double b = 0;
double max = 0;
string maxstr = "";
for (double i = 0; i <= a; i++)
{
for (double j = 0; j <= i; j++)
{
b = (a - i) * (a - j);

//回文数か判断する処理
bool kaibun = true;
double c = b;
int[] keta = new int[b.ToString().Length+1];
for (int k = 1; k <= b.ToString().Length; k++)
{
keta[k] = int.Parse(b.ToString().Substring(k-1, 1));
}

if ((int)(b.ToString().Length / 2) * 2 == b.ToString().Length)
{
for (int l = 1; l <= b.ToString().Length / 2; l++)
{
if (keta[l] != keta[b.ToString().Length - l + 1])
{
kaibun = false;
break;
}
}
}
else
{
for (int l = 1; l <= (int)(b.ToString().Length / 2); l++)
{
if (keta[l] != keta[b.ToString().Length - l + 1])
{
kaibun = false;
break;
}
}
}

if (kaibun == true)
{
if (b >= max)
{
max = b;
maxstr = b.ToString() + " = " + (a - i).ToString() + " * " + (a - j).ToString();
}
}
}
}
Console.WriteLine(maxstr);
Console.ReadLine();
}
}
}

出力結果:906609 = 913 * 993

ProjectEulerを斬る!問3

Problem 3
02 November 2001

The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?

13195の素因数は5,7,13,29です。
600851475143の最も大きい素因数はいくつでしょうか。
(日本語訳:PNN)




a = 600851475143
l = 0
repeat sqrt(a) - 1
b = cnt + 2
if int(a/b)*b == a {
a = a/b
l = b
if a == 1 : break
}
loop

input l


出力結果:・・・・0
HSPの変数型では600851475143はあまりにも大きすぎるみたいです。

困りましたね・・・
じゃあ、C#で解くことにしましょう!

/*
Problem 3
02 November 2001

The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?
*/

using System;
namespace p
{
class kaiho
{
static void Main()
{
double a = 600851475143;
double b = a;
double l = 0;

//Console.WriteLine(Math.Sqrt(a));
for (double i = 2; i < Math.Ceiling(Math.Sqrt(b)); i++)
{
if (Math.Floor(a / i) == Math.Ceiling(a / i))
{
a = a / i;
if (a == 1)
{
l = i;
break;
}
}
}
Console.WriteLine(l);
Console.ReadKey();
}
}
}

出力結果:6857

for (double i = 2; i < Math.Ceiling(Math.Sqrt(b)); i++)
これは素数判定でよく使うテクニックですね。ある数の素因数は、その平方根より大きくなることはないという性質を利用したものです。今回の解答には必要ありませんが、一応テクニックとして紹介しておきます。

ProjectEulerを斬る!Problem2

Problem 2
19 October 2001

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

新たなフィボナッチ数列の要素はその前の2つの要素を足し合わせることでできます。Wiki
1と2から始まって最初の10つの数列の要素は・・・
1,2,3,5,8,13,21,34,55,89・・・となります。
今、4000000を越さないフィボナッチ数列の要素を考えます、そのなかで偶数の要素の総和を求めなさい。
(日本語訳PNN)




dim a,3
a(0)=0
a(1)=1
a(2)=2

sum = a(2)

repeat
a(0) = a(1) + a(2)
if a(0)>4000000 {
break
}

if int(a(0)/2)*2 == a(0) {
sum += a(0)
}
a(1) = a(2)
a(2) = a(0)
loop

input sum


出力結果:4613732

フィボナッチ数列は隣り合う要素の比が黄金比に近づいていくことが知られています。

ProjectEulerを斬る!Problem1

このシリーズはProjectEulerの問題をHSPで解いていこうというものです。

では、早速問題を解いていくことにしましょう。

Problem 1
05 October 2001

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

10未満の数字で3と5の倍数は3,5,6,9です。その総和は23になります。
では1000未満の数字で3と5の倍数の総和は幾つになるでしょう。(日本語訳PNN)




a = 0
repeat 1000
if int(cnt/3)*3==cnt {
a += cnt
}
else {
if int(cnt/5)*5==cnt {
a += cnt
}
}
loop
input a


出力結果:233168

このint(cnt/n)*n==cntというのは、私がN88Basic時代に多用していた技で
intというのはそのカッコで括られた部分の式の値の整数値を返すというもので、
例えばint(5.8)=5となり、int(1.0)=1、int(1.3)=1というふうになります。
��の倍数aというのは、aはnでわると整数値を返すというものなので、
int(a/n)=nとなります。例を挙げるとint(8/2)=int(4)=8/2というものです。

逆に、aがnの倍数でないというのは、int(a/n)≠nということになります。
例を挙げるとint(5/2)=int(2.5)≠5/2ということです。

これを利用してaがn(3,5)の倍数かどうかを見極めているのです。

C#勉強中なう

image





この本読んで勉強中。しっかし理屈が詳しく書いてないのでちょっとわかり辛いけど、じっくりと読むと、どのコードがどうしているのかが分かってきてかなり面白い。



今やってるコード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

Image plane1;

private void Form1_Load(object sender, EventArgs e)
{
Text = "Plane FLY!";
Width = 550; Height = 400;
Left = (Screen.PrimaryScreen.Bounds.Width - Width) / 2;
Top = (Screen.PrimaryScreen.Bounds.Height - Height) / 2;
BackColor = Color.Gray;
plane1 = Image.FromFile("Plane.gif");

pictureBox1.Image = Image.FromFile("plane.gif");
pictureBox1.BackColor = Color.Gray;
pictureBox1.Left = 10;
pictureBox1.Top = 50;
pictureBox1.Visible = false;

button1.SetBounds(200, 320, 62, 31);
button2.SetBounds(300, 320, 62, 31);
}

private void button1_Click(object sender, EventArgs e)
{
Graphics gp = pictureBox1.CreateGraphics();

timer1.Interval = 200;
timer1.Enabled = true;
timer2.Interval = 200;
timer2.Enabled = true;

pictureBox1.Visible = true;
gp.Dispose();
}

private void timer1_Tick(object sender, EventArgs e)
{
pictureBox1.Left += 10;

if(pictureBox1.Left > Width) {
pictureBox1.Left = 10;
}
}

bool flag = true;
private void button2_Click(object sender, EventArgs e)
{
flag = !flag;

if (flag == true)
{
pictureBox1.Visible = true;
}
else
{
pictureBox1.Visible = false;
}
}

int px = 10, py = 100;
int oldpx = 10;
private void timer2_Tick(object sender, EventArgs e)
{
Graphics g = CreateGraphics();
g.FillRectangle(Brushes.Cyan, oldpx, py, plane1.Width, plane1.Height);

if (px > 550)
{
px = -10;
}
px += 10;
oldpx = px;

g.DrawImage(plane1, new Rectangle(px, py, plane1.Width, plane1.Height));
g.Dispose();
}
}
}



アイマスの原曲

9.18があってからアイマス界隈では色々なことがありました。

まあ、そんな事は今はどうでもいいんですけど、アイマスの原曲は本当に色々なところからきています。

私はあんまり音楽には詳しくないので、音楽好きなファンがリクエストした曲を聞いて、「この曲は原曲なんなんだろう」と気になることが多く、そして、検索してみて意外なグループが歌っている事を知って驚くことも少なくないです。

最近驚いたのはこれ

image



foobar2000の表示が色々おかしいですが、一応カスタム途中なのでということにしておきます。

このスウィートドーナッツって曲はパヒュームの曲らしいですね。

今とは全然曲風が違う・・・というほどこのグループには詳しくないのですが、パヒュームが原曲か!なんてちょっと驚いたりしました。

わざわざ、あんな機械音みたいな声にしなくても十分可愛らしくて良い歌声だと思うのですけどね・・・まあ、余計なお世話でしょう。

他にはこれ




 

最後に、今、私のイチオシのアイドル

可愛すぎるだろ常識的に考えて・・・俺のオカンとおんなじぐらいの年齢の方だが・・・

俺は生まれるのが少し遅かったようだorz



ちょっと頭の体操?

簡単だって言うからやってみたけど - 零客痩地:
ここで紹介されていた問題をやってみました。

;20110128:02:03 - 20110128:02:17
a = 0
b = ""
objsize 300,20
input a
input b
button gosub "Go",*hondai
stop

*hondai
sdim card,a
counter = 0
repeat
if strlen(b)==0 : break
card(counter) += strmid(b,0,1)
b = strmid(b,1,strlen(b)-1)
counter ++
if counter > a-1 {
counter = 0
if strlen(b) < a : break
}
loop

color 255,255,255 : boxf
color 0,0,0
repeat a
pos 0,cnt *20 + 60 : mes card(cnt)
loop
return

実行結果
無題

しっかしaとかbって、急いでいるとまともな変数名も思いつかないもんですねw
この問題10分で解けないといけないらしいですけど14分かかりましたorz

ん?何関数になってないじゃん?大丈夫!HSPは全ての変数がグローバルだから、チャンチャン。

2011年1月27日木曜日

FireFoxでのFloatすると背景色が反映されないの解決法

さっきも書いたけど、FireFoxでは親のDivに内包される子のDivがFloatされると、親のDivで指定した背景色が反映されなくなるというバグが存在するらしい。
その解決方法として、親のDivに高さを指定してやればいいらしい。

↓書き換える前

/*
ブログトップロゴとgoogleカスタム検索の2カラム化
*/
#Blog_Top{
clear:both;
background-color:#eeeeee;
width:100%;
}

#Blog_Title{
margin:0;
width:70%;
float:left;
}
#Blog_Top_Search{
padding-top:1em;
width:30%;
float:right;
}


↓書き換えたあと

/*
ブログトップロゴとgoogleカスタム検索の2カラム化
*/
#Blog_Top{
clear:both;
background-color:#eeeeee;
width:100%;
height:3em;       ←ここを書き加えた
}

#Blog_Title{
margin:0;
width:70%;
float:left;
}
#Blog_Top_Search{
padding-top:1em;
width:30%;
float:right;
}


2011年1月21日金曜日

ぶぶチャチャとか

ぶぶチャチャって知ってますか?

私このOPとEDがとても好きなのですが、いかんせんかなり子供向けの番組なので友人には中々話せないでいます。

今見ても、なんとなく私の幼少時代のことが思われて、中々感傷的な気分になれるホンワカとしたアニメです。

将来的にはこれのSSも書きたいかな。



日本人と酒

 その昔、日本ではどぶろくというお酒の一種が民間で作られていたという話は皆さんご存知のことだと思います。

 そして、現在日本でアルコール度数1%以上の造酒が禁じられているというのも、みなさんよくご存知のことだと思います。

 これは、過去に酒税が日本の主要な税収減であったことが、おそらく大きな影響を及ぼしているからなのでしょうが、知識欲的に、この民間造酒に関して興味が湧いてきたので調べてみることにしました。

当然、現在日本で1%のアルコールを製造することは売る売らないを問わず犯罪になるのでそのへんをよくご理解していただいた上でこの記事をお読みになってください

 まず、どぶろくとは一体何なのか、ここからおはなしを始めましょう。いつものようにWikiからの引用です。

 この酒は米を使った酒類では最も素朴な形態の物と言われ、一般の酒店でも購入可能な濁り酒に近い。これを沈殿濾過する事で清酒を作る事も可能だが、清酒になる程には漉さずに飲用する。清酒に比べ濾過が不十分であるため、未発酵の米に含まれる澱粉や、澱粉が分解した糖により、ほんのり甘い風味であるが、アルコール度は清酒と同程度の14~17度にもなるため、口当たりのよさがあだとなってつい飲み過ごして悪酔いしやすい。
wikipedia



 うむ~。文章だけでは少々分かりづらい気もするので、実際にどのようなものかを動画で見ることにしましょう。

 上の動画のように、炭酸飲料のように激しく発砲するのが特徴です。しかもその原理は炭酸飲料のそれと全く同じです。その泡の正体は酵母によって生成された二酸化炭素だからです。

 どぶろくに限らず、日本のお酒というものは、外国のそれとは少々お酒になるまでのプロセスが違います。

 海外の例としてワインをあげることにします。ワインの原材料は当然ぶどうです。甘いです。
 またもうひとつの例としてビールを上げましょう。麦芽はそれほど甘くありません。しかし、ビールの製造工程では、まず原材料の麦芽をアミラーゼという私たちの唾液にも含まれているのと同じ名前(作用は一緒)の酵素を反応させて生成された液体を発酵させて作ります。当然、酵素によって糖化されたその液体は非常に甘いです。

 しかしながら、日本酒はどうでしょうか。日本酒の原材料の米は甘いですか?お米にも味があって、当然噛んでいれば甘さが感じられる!そういった声も聞こえてきそうですが、単純に比較の話で、米は当然ながらぶどうジュースや、アミラーゼを反応させた麦芽に比べると甘さが劣ります。

 日本のお酒は、実は原材料の米の糖化と発酵が同時に進行する、世界でも珍しいお酒の生成プロセスを経るお酒なのです。

 日本酒の生成プロセスを単純に表記してしまうと以下のようになります。
 
 米 → 糖 → アルコール
 
 米を糖にするには、日本酒では麹菌を使います。麹の生成する酵素が米のデンプン質を糖に分解するのです。
 そして糖をアルコールに変えるのが、酵母菌の働きなのです。

 つまり、生成中の日本酒の中には、この酵母菌と麹菌が共存しているということになります。

 まあ、ここまで日本酒の生成プロセスを実に単純化してお話ししました。
 では、古来日本で行われていた闇酒、つまりどぶろくはどのように作るのでしょうか。
 
 ネットで色々検索しているうちに非常に興味深いページをいくつも見つけることが出来ましたのでそれをもとにお話ししていきたいと思います。
 
 どぶろくを作るのに必要なものは、
 
 まずは必須アイテムとして、米、麹、酵母(パンを作るときにつかうドライイーストでも構いません)、どぶろくを醸すための容器(梅酒をつけるためのあの大きな容器が便利だそうです。)

 

 これらの材料が何故必要なのかが先ほどお話ししたとおりです。

 理論的に言えばたしかにこの材料だけでできてしまいそうな気もしますが、それに加えておいたほうが良いものが結構あります。

 それは砂糖です。

 話がそれますが、先進国の中でも未だに個人で造酒することが禁じられている国は日本だけです。違法であるがゆえに日本語の資料は非常に少なく、情報交換の掲示板も非常に少ないのです。
 海外では、例えばミードという薄めた蜂蜜に酵母をいれておいておいただけの非常に簡単にできてしまうお酒専門の掲示板があったりします。そこで様々な情報のやりとりが行われていて、レシピのやりとりなど中々見ていて飽きないものでした。実はこのミードというお酒は、北欧の国では新婚の女性が漬けることで知られていて、ミードがうまく作れる女性はいい嫁さんになるなんておはなしもあるそうな。

 話がだいぶんそれてしまいましたが、日本では先ほど申したように造酒は違法ですから、それゆえに掲示板も少ないのです。

 その数少ない掲示板が某所にあったりするのですが、
http://toki.2ch.net/test/read.cgi/sake/1294892994/
 そこの住民いわく、どぶろくに砂糖を加えるのは邪道だそうです。

 しかしながら、お米をどぶろくに変えてくれるイーストや麹は活発に活動できるようになるのに結構な時間がかかります。生き物ですからいれた瞬間にすぐに活発になるというわけにはいかないのです。

 そして、私たちの身の回りには至る所に雑菌・カビがうようよいます。彼らにとって、どぶろくの原材料になる温かいご飯や、糖分は絶好の繁殖地帯です。

 それを防ぐために、ヨーグルトを加えたりするらしいのですが、ヨーグルトを加えてしまうと、完成したどぶろくはお酒というよりも乳酸飲料の感じがしてしまうそうです。

 なので最初に砂糖を入れてしまえばいいのです。


 では大まかなプロトコルを書くことにします。

1.ご飯を固めに炊く。
2.梅酒の瓶をよく洗い、殺菌する。
3.瓶に炊いたご飯を入れる。
4.瓶に水を入れる。水の量はご飯が浸るぐらいであるが、炊きたてで熱々のままいれたご飯と水をよくかき混ぜて、50度未満20度以上あたりになるように調節する。
5.そこに砂糖、麹、酵母を加えてよく混ぜる(どぶろくなので目分量です、ただ麹・酵母だけは少ないと雑菌に負けて腐らせてしまうかもしれないので最初は多めに入れたほうがいいでしょう。目安は米3合に麹500g酵母6g)
6.あとは栓をしてひたすら放置

え?もう終わり?
そうです、もう終わりです。

 あとはどこか適当な場所に放置して、しばらく待つだけです。適当に1日おきにお玉かなんかでかき混ぜてやってください。
 
 お酒は生き物なので日に日に変化していきます。最初は米が水を吸って膨らみます。しばらくすると、下の方に白い液体が、上の方に米粒が浮いている状態になります。

 発酵が活発な頃は、瓶に耳を当ててやるとシュワシュワと音がなるそうです。

 のみごろは自分で判断してください。毎日1回ぐらいはかき混ぜてやって、その時に味見でもしたらいかがでしょうか。

 ただ、どぶろくはナマモノですので、飲み頃を過ぎると急速に劣化していきます。具体的に言うと酸っぱくなるそうです。

 長期保存の手段として火入れという方法があるのですがこれはまた後日お話しすることにしましょう。

 ちなみに、最初にヨーグルトを入れる方法もあることをご紹介しましたが、これはヨーグルトに含まれる乳酸菌が生成する乳酸が雑菌の増殖を防ぐ働きがあるからです。
 この乳酸が雑菌の増殖を防ぐことに注目して、その乳酸だけを最初の頃に原材料に追加して雑菌の増殖を防ぐという手法で日本のある酒造メーカが特許を取得したくらいです。

 どぶろくは生き物で作られています。意外に盲点なのは、納豆菌です。

 どぶろくを創りだしてくれる菌たちは納豆菌には非常に弱いので、納豆を食べたあとしばらくはどぶろくづくりはやめておいたほうがいいです。あと雑菌には本当に気をつけてください。

 基本的に発酵と腐敗は紙一重の部分が多いので、飲むときには五感全部を使って安全かどうか確かめてください。

 お酒の臭いがしなくて臭い匂いがしたり、舌がしびれたりするものは危険です。

 日本では違法であるのにも関わらず、結構な情報がweb上に溢れています。
 google検索結果

 違法なので健康面でもなんにおいても自己責任ですよ。

2011年1月20日木曜日

20110120-工事中間報告

htmlコードはこちら


/*
サイドメニューとブログ本体の2カラム化
*/
#Side_Menu{
width:20%;
float:left;
border-right-style:dotted;
border-right-width:1px;
border-right-color:#cccccc;
padding-right:1%;
}

#Blog_Body{
width:75%;
float:right;
padding-left:1%;
}

/*サイドメニュー*/
#Author_Top,#Link_Top,#Categ_Top{
clear:both;
border-left-style:solid;
border-left-width:3px;
border-left-color:#000000;
border-bottom-style:solid;
border-bottom-width:1px;
border-bottom-color:#000000;
}

/*個別記事表示*/
#Blog_Body_Permanent_Coment_Disp{
clear:both;
padding-left:1em;
}
#Blog_Body_Permanent_NPDisp{
text-align:center;
}
#Blog_Body_Permanent_Coment_Submit_Form{
background-color:#eeeeee;
padding:1em;
}

/*複数種類のidにまたがる設定領域*/
#Blog_Body_Index_Top,#Blog_Body_Permanent_Top{
clear:both;
padding-left:0.4em;
border-left: medium solid #cccccc;
}



/*工事中であることを示す表示領域(工事が終われば撤去予定)*/
#str {
clear:both;
}