数学パズル問1
「プログラマ脳を鍛える数学パズル」という本を買った。
書籍ではRubyやPHPでの実装が多いので、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; }