c语言学习2---变参函数&&素数筛

1.变参函数

#include <stdio.h>
#include <inttypes.h>
#include <stdarg.h>#define P(func) {\
printf("%s = %d\n",#func, func);\
}
/*
* 求变参列表中的最大值
* @param n 变参列表中n的个数
*/
int max_int(int n, ...) {
    int ans = INT32_MIN;
    va_list arg;
    va_start(arg, n);
    while (n--){
        int temp = va_arg(arg, int);
        if (temp > ans) ans = temp;
    }
    va_end(arg);
    return ans;
}
​
int main() {
    P(max_int(3,1,2,3));
    return 0;
}

2.printf函数实现

#include <stdio.h>
#include <stdarg.h>
#include <inttypes.h>int reverse_num(int n, int *temp) {
    int digit = 0;
    do
    {
        *temp = *temp * 10 + n % 10;
        digit += 1;
        n /= 10;
    } while (n);
    return digit;
}
​
int output_num(int n, int digit) {
    int cnt = 0;
    while (digit--)
    {
        putchar(n % 10 + '0');
        cnt += 1;
        n /= 10;
    }
    return cnt;
}
​
​
int my_printf(const char *frm, ...) {
    int cnt = 0;
    va_list arg;
    va_start(arg, frm);
#define PUTC(a) putchar(a), ++cnt
    for (int i = 0; frm[i]; i++) {
        switch (frm[i]) {
        case '%': {
            switch (frm[++i]) {
            case '%': {
                PUTC(frm[i]);
                break;
            case 'd': {
                /*int temp = va_arg(arg, int);
                if (temp < 0) PUTC('-') temp = -temp;
                int x = 0, digit = 0;
                do{
                    x = x * 10 + temp % 10;
                    digit += 1;
                    temp /= 10;
                } while (temp);
                while (digit--) {
                    PUTC(x % 10 + 48);
                    x /= 10;
                }*/
                int x = va_arg(arg, int);
                uint32_t xx = 0; // 表示范围为-2的32次方到+2的32次方 int的表示范围为-2的31次方到+2的31次方
                if (x < 0) PUTC('-'), xx = -x;
                else xx = x;
                int x1 = xx / 100000, x2 = xx % 100000;
                int temp1 = 0, temp2 = 0;
                int digit1 = reverse_num(x1, &temp1);
                int digit2 = reverse_num(x2, &temp2);
                if (x1)digit2 = 5;
                else digit1 = 0;
                cnt += output_num(temp1, digit1);
                cnt += output_num(temp2, digit2);
            }   break;
            case 's': {
                const char *str = va_arg(arg, const char*);
                for (int i = 0; str[i]; i++) {
                    PUTC(str[i]);
                }
            }break;
            }
            }   }
                  break;
        default:
            PUTC(frm[i]);
        }
    }
    return cnt;
}
​
int main() {
printf("hello world\n");
my_printf("hello world\n");
​
printf("INT32_MIN = %d\n", INT32_MIN);
my_printf("INT32_MIN = %d\n", INT32_MIN);
char str[] = "hello world!";
printf("str = %s\n", str);
my_printf("str = %s\n", str);
return 0;
}

3.数组与预处理命令

 

 

#include <stdio.h>
/*
*判断输入的数字是否是素数
*/
int is_prime(int n) {
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}

int main() {
    int n;
    while (~scanf("%d",&n))
    {
        for (int i = 0; i <= n; i++) {
            if (!(is_prime(i))) continue;
            printf("%d\n", i);
        }
        
    }
    return 0;
}

 

 

#include <stdio.h>
#define MAX_N 100

int prime[MAX_N + 5] = {0};

void init() {
    for (int i = 2; i <= MAX_N; i++) {
        if (prime[i] == 0) {
            for (int j = 2 * i; j <= MAX_N; j += i) {
                prime[j] = 1; // 将prime[j]标记为合数
            }
        }
    }
}
int main() {
    init();
    for (int i = 2; i < MAX_N; i++) {
        if (prime[i]) continue;
        printf("%d\n", i); // 打印100以内所有素数
    }
    return 0;
}
#include <stdio.h>
#define MAX_N 100

int prime[MAX_N + 5] = {0};

void init() {
    for (int i = 2; i <= MAX_N; i++) {
        if (prime[i] == 0) { // 标记没有标记的数字
            prime[++prime[0]] = i; // 将prime[0]作为计数器
            /*for (int j = i * i; j <= MAX_N; j += i) { // 将j= 2*i 改为j=i*i进行优化,去除重复标记
                prime[j] = 1; // 将prime[j]标记为合数
            }*/
            for (int j = i; j <= MAX_N / i; j++) { // 将j = i*i 做修改避免int类型超限报错
                prime[j * i] = 1;
            }
        }
    }
}
int main() {
    init();
    /*for (int i = 2; i < MAX_N; i++) {
        if (prime[i]) continue;
        printf("%d\n", i); // 打印100以内所有素数
    }*/
    for (int i = 1; i <= prime[0]; i++) {
        printf("%d\n",prime[i]);
    }
    return 0;
}

求100以内每个数字的最小素因子

#include <stdio.h>
#define MAX_N 100

int prime[MAX_N + 5] = {0};

void init() {
    for (int i = 2; i <= MAX_N; i++) {
        if (prime[i]) continue;
        for (int j = i; j <= MAX_N; j += i) {
            if (prime[j]) continue;
            prime[j] = i;
        }
    }

}
int main() {
    init();
    for (int i = 2; i <= MAX_N; i++) {
        printf("min_fac[%d] = %d\n", i, prime[i]);
    }
    return 0;
}

求100以内的每个数字的最大素因子

#include <stdio.h>
#define MAX_N 100

int prime[MAX_N + 5] = {0};

void init() {
    for (int i = 2; i <= MAX_N; i++) {
        if (prime[i]) continue;
        for (int j = i; j <= MAX_N; j += i) {
            //if (prime[j]) continue;
            prime[j] = i;
        }
    }

}
int main() {
    init();
    for (int i = 2; i <= MAX_N; i++) {
        printf("min_fac[%d] = %d\n", i, prime[i]);
    }
    return 0;
}

 

 

 

 

#include <stdio.h>
#define MAX_N 8000000

int prime[MAX_N + 5] = { 0 };

void init() {
    for (int i = 2; i <= MAX_N; i++) {
        if (prime[i]) continue;
        prime[++prime[0]] = i;
        for (int j = i; j <= MAX_N / i; j++) {
            prime[j * i] = 1;
        }
    }
    return;
}

void solve(int a, int b) {
    int min = b, max = 0;
    int min_a, min_b, max_a, max_b;
    for (int i = 1; i <= prime[0] && prime[i + 1] <= b; i++) {
        if (prime[i] < a) continue;
        int temp = prime[i + 1] - prime[i];
        if (temp < min) {
            min = temp;
            min_a = prime[i], min_b = prime[i + 1];
        }
        if (temp > max) {
            max = temp;
            max_a = prime[i], max_b = prime[i + 1];
        }
        if (max == 0) {
            printf("There are no adjacent primes.\n");
        }else {
            printf("%d,%d are closest, %d,%d are most distant.\n",min_a, min_b, max_a,max_b);
        }
    }
    return;
}

int main() {
    init();
    int a, b;
    while (~scanf("%d%d",&a,&b))
    {
        solve(a, b);
    }
    return 0;
}

 

 

 

 

 

 

posted @ 2021-07-07 21:40  yiwenzhang  阅读(107)  评论(0)    收藏  举报