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

#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; }

#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; }

浙公网安备 33010602011771号