1から与えられた数まで素数かどうか(C)
前回の続きができた。今度は1から与えられた数まで調べる
#include <stdio.h> #include <math.h> int main(void){ int max;//最大値 int i, j; int sosu[100]; //とりあえず100まで。ここが0だったら素数 double sqr[100]; //それぞれの平方根 int num[100]; //1から最大値までが入っている scanf("%d", &max); for(i=1; i<=max; i++){ sosu[i-1] = 0; num[i-1] = i; sqr[i-1] = floor(sqrt(num[i-1])); } if(max>=3){ printf("1\n"); printf("2は素数です\n"); printf("3は素数です\n"); for(i=3; i<=max; i++){ for(j=2; j<=sqr[i]; j++){ if (num[i]%j == 0){ sosu[i] = 1; } if (j == sqr[i]){ if (sosu[i] == 0){ printf("%dは素数です\n", num[i]); } else{ printf("%d\n", num[i]); } } } } } else if (max == 1){ printf("1\n"); } else if(max == 2){ printf("1\n"); printf("2は素数です\n"); } return 0; }
やっぱり3以下は直接書いた方が早いという結論に現時点では至っている。
あと、とにかく大きい数を入力したくなる。
与えられた数が素数かどうか(C)
sqrtを使って素数かどうかを判断できるものを作れると知ったので、
入力した数字が素数かどうか判断するものを書いてみた。
#include <stdio.h> #include <math.h> int main(void){ int num, i; int sqr; //平方根 int sosu = 0; //ここの値が変わらなかったら素数 scanf("%d", &num); sqr = floor(sqrt(num)); if(num == 1){ printf("1です\n"); } if(num == 2){ printf("2は素数です\n"); } if(num == 3){ printf("3は素数です\n"); } for(i=2; i<=sqr; i++){ if(num%i==0){ sosu = 1; } if(i==sqr){ if(sosu==0){ printf("%dは素数です\n", num); } else{ printf("%dは素数ではありません\n", num); } } } return 0; }
1~3までの値をどうするか困ったのでそのまま書いた。
次は1から入力した値までの数を判断させるもの作れたらいいね
math.h その1(C)
math.h、何が何だか忘れそう
平方根・累乗・累乗根
sqrt(x); //平方根 pow(x,n); //累乗 pow(x, 1/n); 累乗根
対数関数・指数関数
log(x) //対数関数 exp(x) //指数関数 //指数関数は値が大きくなるので理科的表記に
切り上げ・切り捨て・四捨五入
ceil(x) //切り上げ floor(x) //切り捨て floor(x+0.5)//四捨五入 //返却値は実数
弧度
kodo = (M_PI * kakudo) / 180//M_PIはπ
三角関数
sin(kodo)
cos(kodo)
tan(kodo)
asin(kodo)
acos(kodo)
atan(kodo)//90度に気を付ける
桁数を求める
c = pow(n, p);
p = log10(c) / log10(n);
log10(c) = p * log10(n);//桁数
ビット数
bit = log2(pow(n, p));
bit = p * log2(n);//ビット数
breakを使わないswitch(C)
西暦・月・日を入力して、
12月31日までの日数を答えるプログラムを作ってるときに、
breakを使わないswitch文でいけるんじゃね?と思って、
やってみた。
構造としては、
case 月:
の形で、1月だと2月、3月……と12月まで流れていく。
それぞれの月でその月に計何日あるかを残り日数の変数に足す。
日本語が難しい
#include <stdio.h> int main(void){ int y, m, d; //左から西暦、月、日 int day = 0; //残り日数 scanf("%d %d %d", &y, &m, &d); switch(m){ case 1: day += 31; case 2: if (y%400 == 0 || (y%4 == 0 && y%100 != 0)){ day++; //閏年の時、1日増やす } day += 28; case 3: day += 31; case 4: day += 30; case 5: day += 31; case 6: day += 30; case 7: day += 31; case 8: day += 31; case 9: day += 30; case 10: day += 31; case 11: day += 30; case 12: day += 31; day -= d; break; } printf("12月31日まで残り%d日\n", day); return 0; }
只今ブログ休止中です。
再開は7/19以降を予定
ROT13というものがあるらしい(Python)
ROT13とは、
"Rotate by 13 places"
の略らしい。
英語を丁度13文字ずらしてくれる。
import codecsをして、
codecs.encode('変換したい文字', 'rot-13')で
変換してくれる。スゴイ。
import codecs print(codecs.encode(input(), 'rot-13')) #print(codecs.decode(input(), 'rot13'))この書き方でもいけた #Gunax lbhと入力 #Thank youと出力!
ということで、上にもある通りencodeとdecodeでの違いがよくわからん、
というのが今後理解したいところ。
今回はこういうのあるんだーと知った話でした。
Unicodeを少し(Python)
ord(c)とは
1 文字の Unicode 文字を表す文字列に対し、その文字の Unicode コードポイントを表す整数を返します。
例えば、 ord('a') は整数 97 を返し、 ord('€') (ユーロ記号) は 8364 を返します。これは chr() の逆です。
(Python標準ライブラリの説明より)
使ってみる
>>>ord('宴') 23476
chr(i)とは
Unicode コードポイントが整数 i である文字を表す文字列を返します。
例えば chr(97) は文字列 'a' を、 chr(8364) は文字列 '€' を返します。 ord() の逆です。
引数の有効な範囲は 0 から 1,114,111 (16 進数で 0x10FFFF) です。 i が範囲外の場合 ValueError が送出されます。
(Python標準ライブラリの説明より)
先程の整数を入れてみる
>>>chr(23476) '宴'
文字をずらしてみる
moji = input() #文字を入力 shift = int(input()) #いくつ後ろにずらすか result = "" for act in moji: num = ord(act) #文字コード shifted = chr(num + shift) #文字にする result += shifted print(result) >>>Khoor >>>-3 'Hello'
chr()の中に色々な数字入れたくなるよね
Staticしたい(C)
staticについて
書こうと思ったんですが最後まで書けなかった。
でもとりあえずの途中経過として公開はする。
使ってみた
#include <stdio.h> void show(); int main(void){ int i; for(i=0; i<3; i++){ show(); } return 0; } void show(){ static int a; //指定しない場合0で初期化 int b = 3; a++; b++; printf("%d回目:", a); printf("%d\n", b); return; } /* 1回目:4 2回目:4 3回目:4 */
staticを付けると、初期化が最初に呼び出されたときだけ行われて、
その後値が保持される
char型配列をreturn
することがstaticを使う方法でもできると聞いたのでやってみようとしたら、
上手くできなかった。
検索にも疲れたので後日検索して追記。
別のファイルから使用できないように関数や変数を修飾
これについてはヘッダーファイルの扱いがよくわからなかったので、
ヘッダーファイルが使えるようになった時に追記します