Problem 4
#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
左右どちらから読んでも同じ値になる数を回文数という。 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