情報系ゴリラのプログラミング日誌

情報系大学に通う霊長類が日々学んだことをアウトプットするためのリソースの掃き溜めです.

Luhnアルゴリズム

友達と話してたら,アルゴリズムの勉強したいよねという話題になった.そしたら,

友達「Luhnアルゴリズムpythonでは書けるんだけど,Cで書けなくってさー...」

僕「る〜んあるごりずむ?」

ナニソレシラナイということで勉強してみた.助けてwiki先生!

へー,クレジット番号のチェックサムに使うのかー.

pythonのコードはwikiに転がってたので,それを流用.

def check_number(digits):
    _sum = 0
    alt = False
    for d in reversed(digits):
        assert 0 <= d <= 9
        if alt:
            d *= 2
            if d > 9:
                d -= 9
        _sum += d
        alt = not alt
    return (_sum % 10 ) == 0

strNum = input ("Enter numbers:")
listNum = list(map(int,strNum))
if check_number(listNum):
    print('Number is correct')
else:
    print('Number is wrong')

 

さて,これをCで書くか...

(2時間経過)

...こんなんなりました.

#include<stdio.h>
#include<string.h>  //strlen()使いたい
#include<stdlib.h>  //exit()使いたい

int check_number(int i[], int i_length);  //int型配列と要素の数を渡してokなら1,noなら0を返す

int ctoi(char c){ // 返り値を−1に改変
  if(c >+ '0' && c <='9'){
    return c - '0';
  }
  return -1;
}

int main(void){
  char str_num[21];
  int num_length = 0, cnt, int_num[21];

  printf("数値を入力(20桁以内):");
  scanf("%s", str_num);
  getchar();
  num_length = strlen(str_num);
  for(cnt = 0; cnt < num_length; ++cnt){  //文字列をint型配列に変換
    if((int_num[cnt] = ctoi(str_num[cnt])) == -1){  //変換の例外処理
      printf("cast_error\n");
      exit(1);
    }
  }
  if(check_number(int_num, num_length))
    printf("number is correct\n");
  else
    printf("number is wrong\n");

  return 0;
}

int check_number(int i[], int i_length){  //int型配列と要素の数を渡してokなら1,noなら0を返す
  int sum = 0, cnt, tmp;
  
  for(cnt = 0; cnt < i_length; ++cnt){
    tmp = i[i_length - 1 - cnt];  //配列の逆側から一桁ずつ読込
    if(!(0 <= tmp && tmp <= 9)){  //0未満か10以上だとエラー処理
      printf("check_error\n");
      exit(1);
    }
    if(cnt % 2 == 1){ //右端から偶数桁目の処理
      tmp *= 2;
      if(tmp > 9)
        tmp -= 9;
    }
    sum += tmp;
  }
  if(sum % 10 == 0)
    return 1;
  else
    return 0;
}

 

神様,僕にもっとプログラミングスキルを下さいorz

 

ブログ初めました(fizzbuzz)

うほ.

(こんにちは.はじめまして.ゴリさんと申します.現在,夏のインターン選考に怯えている大学3年生です.僕の周りの人たちは意識が高く,インタンーンどころか採用のエントリーやら,試験やら,精力的に活動しててすごいと思います.内向的な僕も少しだけ触発されて,IT系の長期インターンに行こうかなと思ったら,「エントリーシート出せー」「Webテスト受けろー」「電話で面接しろー」と言われて,早くも心が折れそうです...

あるとは知ってたけど,実際にやる段階になると予想より僕の心に大ダメージ!

Q.学校で何やってきたか?

A.特にナシ. 

Q.基礎的なプログラミングできる?

A.企業のいう基礎的のレベルがわかりません!

 

 そんな訳で,少しでもプログラミングの技術が上がるように,学校や,友達と話したプログラムを,忘れないようにここに書いていきたいと思います.ブログもプログラミングも初心者ですが,少しずつ上達していけたらいいなと思います.

 初回のプログラムは友達が流行ってると言ってた「fizzbuzz」.数字をカウントアップして,3の倍数なら「fizz」,5の倍数なら「buzz」,15の倍数なら「fizzbuzz」,それ以外は数字を出力するプログラムです.友達は,どれだけコードを短く出来るか挑戦してましたが,僕にそんな技量はないので,普通のコードです.僕は大学の講義で「C」,趣味でたまに「python」を書いているので,どちらも書いていけたらいいなと思います.

まずは,Cの方.

#include<stdio.h>
int main(void){
  int cnt;
  printf("~Welcome FizzBuzz~\n");
  for(cnt = 0; cnt < 100; cnt++){

    if(cnt % 3 != 0 && cnt % 5!= 0){
      printf("%d", cnt);
    }
    if(cnt % 3 == 0) 
      printf("Fizz"); 

    if(cnt % 5 == 0) 
      printf("Buzz");
    printf("\n");
  }
  return 0;
}

 

次にpython

print('~Welcome to FizzBuzz~')
for x in range(100):
    if x % 3 != 0 and x % 5 != 0:
        print(str(x), end = '')
    if x % 3 == 0:
        print('Fizz', end = '')
    if x % 5 == 0:
        print('Buzz', end = '')
    print('')

では,また次回.おつかれさまでした.)