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('')
では,また次回.おつかれさまでした.)