Problem 6

最初の10個の自然数について、その和の二乗と、二乗数の和は以下の通り。

1² + 2² + ... + 10² = 385
(1 + 2 + ... + 10)² = 3025

これらの数の差は 3025 - 385 = 2640 となる。

同様にして、最初の100個の自然数について和の二乗と二乗の和の差を求めよ。


プログラム
#include<stdio.h>

void main(void){
int i,sum = 0;
int waji,jiwa = 0; // waji:和の二乗、jiwa:二乗の和
printf("Q:最初の100個の自然数について和の二乗と二乗の和の差\n");
for(i=1; i<=100; i++){
sum += i; // wajiの為に合計sumを求める
jiwa += i*i; // jiwaを求める
}
waji = sum*sum; // 合計の二乗
printf("%d - %d = %d\n",waji,jiwa,waji-jiwa);
}

結果
Q:最初の100個の自然数について和の二乗と二乗の和の差
25502500 - 338350 = 25164150
Problem 5

2520 は 1 から 10 の数字の全ての整数で割り切れる数字であり、そのような数字の中では最小の値である。

では、1 から 20 までの整数全てで割り切れる数字の中で最小の値はいくらになるか。


プログラム
#include<stdio.h>

void main(void){
int a,i,ans;
printf("Q5:1 から 20 までの整数全てで割り切れる数字の中で最小の値\n");
for(a=2520;;a++){ // 問題文から答えは2520より大きい
// 先に大きい数字で割ることで、処理回数を減らす
for(i=20; i>1; i--)if(a % i != 0) break; // 割り切れなければ即次へ
if(i==1) break; // 20から1(正確には2)までの数で割り切れたら終わり
}
printf("%d\n",a);
}

結果
Q5:1 から 20 までの整数全てで割り切れる数字の中で最小の値
232792560
Problem 4

左右どちらから読んでも同じ値になる数を回文数という。 2桁の数の積で表される回文数のうち、最大のものは 9009 = 91 × 99 である。

では、3桁の数の積で表される回文数のうち最大のものはいくらになるか。


プログラム

#include<stdio.h>
#include<math.h>

// 数字の桁数を求める
int keta(int k){
int ctr = 0;
do{
k = k / 10;
ctr++;
}while(k != 0);
return ctr;
}

int kaibun(int n){ // 回文数なら1違えば0を返す。(9桁まで)
int k = keta(n); // 桁数を求める
int beki;
int i,a,y;
int x[10] = {0};

// ここから下はごちゃごちゃしてて、よく分かってない
// とりあえずうまく動いてるみたい
for(i = 1; i <= k; i++){ // 各桁の数をx[i]に格納
beki = pow(10,i);
y = pow(10,i-1);
x[i] = (n - (n / beki * beki)) / y ;
}
i = 1;
while(x[i] == x[k-i+1] && i < k / 2 + 1)i++;
if(i==k/2+1) return 1;
return 0;
}

int main(void){
int a,i,j,ij;
int max = 0,maxi,maxj;

printf("Q4:3桁の数の積で表される回文数のうち最大のもの\n");
for(i=999; i>1; i--){ // 大きいほうから虱潰しの
for(j=999; j>1; j--){ // 二重ループ
if(kaibun(i*j)){ // i*jが回文数のとき
ij = i * j; // i*jの値をijにいれる
// ijがmaxより大きいときmaxにijを入れる。
// ついでにその時のiとjも記録しておく
if(max<ij){ max = ij; maxi = i; maxj = j;}
break; // 内側のループを抜ける
}
}
}
printf("%d = %d × %d\n",max,maxi,maxj);

}

結果
Q4:3桁の数の積で表される回文数のうち最大のもの
906609 = 993 × 913