概要
↓こちらに参加し、といた中で現時点でん?となったものです
https://paiza.jp/entry/denno2088_qiita
2025/02/09更新
ご指摘いただき、main関数内のconvert(N, &result)をconvert(N, result)に変更
コーディング経験
大学に入ってからC言語を学習中
アプローチ
シンプルに、10進数から3進数に変換する際と10進数から特殊な3進数への変換の際に発生するギャップを埋める方法をとりました。結構汚いコードを書いているとは思いますが暖かく、余力があればご指摘いただけると幸いです。
コード
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 40
void convert(int n, char *result);
int main(void)
{
int N;
char result[MAX_LEN];
scanf("%d ", &N);
convert(N, result);
printf("%s", result);
return 0;
}
void convert(int n, char *result){
if(n == 0){
strcpy(result, "0");
return;
}
char temp[MAX_LEN];
int index, remainder, i;
index = 0;
//特殊な3進法への変換
while(n != 0){
remainder = n % 3;
n /= 3;
//もしあまりが2であったら、それを-1として扱い、n++する(繰り上げする)
//この特殊な3進法においては、通常10進法から3進法を導く時の方法はそのまま使えない。
//なぜなら、10進法の2を特殊な3進法へ変えた時、結果は2となるが、2は特殊3進法で-1を表すためである。
//もし使うのだとしたら、この帳尻を3あげることで、つまり元の10進法で繰り上げることで表現すれば良い。
if(remainder == 2){
remainder = -1;
n++;
//あまりが-2に突入したら、あまりを1にする
}else if(remainder == -2){
remainder = 1;
n--;
}
temp[index++] = (remainder == -1) ? '2' : ('0' + remainder);
}
for(i = 0; i < index; i++){
result[i] = temp[index - 1 - i];
}
//ヌル文字で終端を表す
result[index] = '\0';
}
レイミレビュー(ナルシストVer)
感想
意外と記事書くのって難しいんですね。それはともかく、レビューをAIに受けることができるのとゲーム性を同時に楽しみながらコーディングできるの、すっごいワクワクして面白いと感じました。