NaaN日記

やったこと、覚えたことを発信する場

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、何が何だか忘れそう

コンパイル

GCCコンパイルするためには

gcc hoge.c -lm
平方根・累乗・累乗根
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を使う方法でもできると聞いたのでやってみようとしたら、
上手くできなかった。
検索にも疲れたので後日検索して追記。


別のファイルから使用できないように関数や変数を修飾

これについてはヘッダーファイルの扱いがよくわからなかったので、
ヘッダーファイルが使えるようになった時に追記します