落書きノート

ふと自分が気になった事を書いてます

C言語でデータ構造とアルゴリズム

線形探索法をやる前にひっかかっていた部分があったので、そこだけやってみました。2進数等の基数変換についてのプログラムです。例題と演習問題のプログラムです。

/* 整数を2進数〜36進数に基数変換 */
#include <stdio.h>

int card_convr(unsigned x, int n, char d[]) {
  char dchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  int digits = 0;

  if(x == 0)
    d[digits++] = dchar[0];
  else
    while(x) {
      d[digits++] = dchar[x % n];
      x /= n;
    }
  return digits;
}

int main(void) {
  int i;
  unsigned no;
  int cd;
  int dno;
  char cno[512];
  int retry;

  puts("10進数を基数変換します。");

  do {
    printf("変換する非負の整数 : ");
    scanf("%u", &no);

    do {
      printf("何進数に変換しますか (2-36) : ");
      scanf("%d", &cd);
    } while(cd < 2 || cd > 36);

    dno = card_convr(no, cd, cno);

    printf("%d進数では", cd);
    for(i = dno - 1; i >= 0; i--)
      printf("%c", cno[i]);
    printf("です。\n");

    printf("もう一度しますか (1...はい/0...いいえ) : ");
    scanf("%d", &retry);
  } while(retry == 1);
  
  return 0;
}




/* 整数を2進数〜36進数に基数変換 */
#include <stdio.h>

int card_convr(unsigned x, int n, char d[]) {
  char dchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  int digits = 0;
  int i;
  
  if(x == 0)
    d[digits++] = dchar[0];
  else
    while(x) {
      d[digits++] = dchar[x % n];
      x /= n;
    }

  for(i = 0; i < digits / 2; i++){
    char t = d[i];
    d[i] = d[digits - i - 1];
    d[digits - i - 1] = t;
  }
  
  return digits;
}

int main(void) {
  int i;
  unsigned no;
  int cd;
  int dno;
  char cno[512];
  int retry;

  puts("10進数を基数変換します。");

  do {
    printf("変換する非負の整数 : ");
    scanf("%u", &no);

    do {
      printf("何進数に変換しますか (2-36) : ");
      scanf("%d", &cd);
    } while(cd < 2 || cd > 36);

    dno = card_convr(no, cd, cno);

    printf("%d進数では", cd);
    for(i = 0; i < dno; i++)
      printf("%c", cno[i]);
    printf("です。\n");

    printf("もう一度しますか (1...はい/0...いいえ) : ");
    scanf("%d", &retry);
  } while(retry == 1);
  
  return 0;
}





/* 整数を2進数〜36進数に基数変換 */
#include <stdio.h>

int card_convr(unsigned x, int n, char d[]) {
  char dchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  int digits = 0;
  int i;
  
  if(x == 0)
    d[digits++] = dchar[0];
  else
    while(x) {
      d[digits++] = dchar[x % n];
      printf("%d  |  %2u  ...  %c\n", n, x, d[digits - 1]);
      printf("   +------      \n");
      x /= n;
    }

  for(i = 0; i < digits / 2; i++){
    char t = d[i];
    d[i] = d[digits - i - 1];
    d[digits - i - 1] = t;
  }
  
  return digits;
}

int main(void) {
  int i;
  unsigned no;
  int cd;
  int dno;
  char cno[512];
  int retry;

  puts("10進数を基数変換します。");

  do {
    printf("変換する非負の整数 : ");
    scanf("%u", &no);

    do {
      printf("何進数に変換しますか (2-36) : ");
      scanf("%d", &cd);
    } while(cd < 2 || cd > 36);

    dno = card_convr(no, cd, cno);

    printf("%d進数では", cd);
    for(i = 0; i < dno; i++)
      printf("%c", cno[i]);
    printf("です。\n");

    printf("もう一度しますか (1...はい/0...いいえ) : ");
    scanf("%d", &retry);
  } while(retry == 1);
  
  return 0;
}