計算機の学習メモ

この想像しがたい状況が成立する過程を、以下に詳述する。

数学パズル問1

プログラマ脳を鍛える数学パズル」という本を買った。
書籍ではRubyPHPでの実装が多いので、C言語で実装してみた。
C言語Rubyのように一発で変換できる関数がないので大変だった・・・。

問1:10進数・8進数・2進数のいずれで表現しても回文数となるうち、
10進数で10以上の最小値を求めなさい。

解:585

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define START_NUM 10
#define END_NUM 9999
#define MAX_NUM_LEN 20

int decimal_to_nary(int, int);
int judge_palindrome(int);

int main(void){
  int binary_flag;  /*2進数の回文判定結果*/
  int octal_flag;   /*8進数の回文判定結果*/
  int decimal_flag; /*10進数の回文判定結果*/

  for(int i = START_NUM; i < END_NUM; i++){
    binary_flag = judge_palindrome(decimal_to_nary(i,2));
    octal_flag = judge_palindrome(decimal_to_nary(i,8));
    decimal_flag = judge_palindrome(i);
    if (binary_flag == 0 && octal_flag == 0 && decimal_flag == 0){
      puts("ok\n");
      printf("result : %d\n",i);
      exit(0);
    } else{
      puts("ng\n");
    }
  }
  return 0;
}

/*n進法*/
int decimal_to_nary(int in_num, int fund_num){
  int rem_num = 0;
  int quot_num;
  int res = 0;
  int count = 1;

  quot_num = in_num;
  while(quot_num != 0){
    rem_num = quot_num % fund_num;
    quot_num = quot_num / fund_num;
    res = res + rem_num * count;
    count = count * 10;
  }

  return res;
}

/*回文判定*/
int judge_palindrome(int in_num){
  int num_len = 0;
  int tmp_len = in_num;
  int flag = 0;
  char rev_num[MAX_NUM_LEN] = {'\0'};
  char org_num[MAX_NUM_LEN] = {'\0'};
  int count = 0;

  sprintf(org_num, "%d", in_num);
  while(tmp_len != 0){
    tmp_len = tmp_len / 10;
    num_len++;
  }
  while(in_num != 0){
    int tmp;
    char c_tmp[MAX_NUM_LEN] = {'\0'};
    count++;
    tmp = in_num % 10;
    in_num = in_num / 10;
    sprintf(c_tmp, "%d", tmp);
    strcat(rev_num,c_tmp);
  }
  flag = strcmp(rev_num,org_num);
  printf("reverse number : %s\n",rev_num);
  printf("original number : %s\n", org_num);
  printf("cmp string : %d\n",flag);
  return flag;
}