回复 17楼 不才
你宏定义都不要用,不是更简单吗?
我本楚狂人,凤歌笑孔丘
/* 一维数组练习:一 * 旅馆里有100个房间,从1到100编了号 * 第一个服务员把所有的房间门都打开了, * 第二个服务员把所有编号是2的倍数的房间"相反处理" (所有相反处理是指:原来开着的门关上 * 第三个服务员把所有编号是3的倍数的房间做"相反处理" 原来关着的门打开) * .... * 问第100个服务员来过后,哪几扇门是打开的 */ #include <stdio.h> #define DOOR 100 //100扇门 #define OPEN 1 int main(void) { unsigned short i, waiter; //循环变量 unsigned short door[DOOR]; //门 for (waiter = 1; waiter <= DOOR; waiter++) //初始状态,第一个服务员把所有门打开 door[waiter - 1] = OPEN; for (waiter = 2; waiter <= DOOR; waiter++) //从第二到第一百名服务器依次开关门 for (i = waiter; i <= DOOR; i += waiter) //每次下标从第几名服务员开始 door[i - 1] = !door[i - 1]; //相反处理 printf("第100个服务员来过之后,第 "); for (i = 0; i < DOOR; i++) door[i]?printf("%u ", i + 1):0; printf("扇门是打开的!\n"); return 0; }
/* 求一个二维数组中元素的最大,最小值 */ #include <stdio.h> #define X 3 #define Y 7 void maxandmin(const int [][Y], const int, const int); //输出最大和最小数字 int main(void) { const int sz[X][Y] = { {11, 21, 11, 42, 34, 73, 28}, {14, 121, 101, 54, 32, 13, 128}, {52, 62, 79, 18, 23, 24, 8} }; maxandmin(sz, sizeof sz / sizeof sz[0], sizeof sz[0] / sizeof sz[0][0]); return 0; } void maxandmin(const int sz[][Y], const int x, const int y) { int sum_max, sum_min; int i, j; //循环变量 sum_max = sum_min = sz[0][0]; //设定最大,最小数的初值 for (i = 0; i < x; i++) //遍历数组,找出最大值和最小值 for (j = 0; j < y; j++) { if (sz[i][j] > sum_max) sum_max = sz[i][j]; if (sz[i][j] < sum_min) sum_min = sz[i][j]; } printf("max = %d , min = %d\n", sum_max, sum_min); }
/* 二维数组练习:二 * 在上下对齐的数中用大数减小数并输出 * 15 13 16 11 8 14 12 17 16 14 * 8 9 7 7 3 8 9 9 8 7 * */ #include <stdio.h> #define X 2 #define Y 10 void sub(const int [][Y], const int, const int); int main(void) { const int arr[X][Y] = { {15, 13, 16, 11, 8, 14, 12, 17, 16, 14}, {8, 9, 7, 7, 3, 8, 9, 9, 8, 7} }; sub(arr, sizeof arr / sizeof arr[0], sizeof arr[0] / sizeof arr[0][0]); return 0; } void sub(const int arr[][Y], const int x, const int y) { int i, j; //循环变量 int diff[Y]; //存储差的数组 for(j = 0; j < y; j++) for(diff[j] = 0, i = x - 1; i >= 0; i--) diff[j] = arr[i][j] - diff[j]; for(i = 0; i < y; i++) printf("%d ", diff[i]); return; }
/*精确计算100!*/ #include <stdio.h> #define NUM 100 //求100! #define MAX 3000 //保存阶乘结果的数组最大位数 void fac(); //计算大数阶乘 int main(void) { fac(); return 0; } void fac() { int i, j; //循环变量 unsigned short arr[MAX] = {1}; //保存结果的数组 for(i = 2; i <= NUM; i++) //被乘数从2 到 100 { for(j = 0; j < MAX; j++) //用 i 与数组中每一个数据相乘 arr[j] = i * arr[j]; for(j = 0; j < MAX; j++) //进位控制 { arr[j + 1] += arr[j] / 10; // arr[j] 大于十时,向前进位 arr[j] = arr[j] % 10; //进位后,arr[j]保留个位 } } for (i = MAX - 1; i >= 0; i--) //判断数组下标边界 if(arr[i]) break; printf("结果共 %d 位, 100! = ", i); for(; i >= 0; i--) //打印结果 printf("%u", arr[i]); printf("\n"); return; }
#include <stdio.h> #define N 100 #define SIZE 200 int a[N][SIZE] = {{1, 1}, {1, 2}, {1, 6}}; void Init(int n) { int i, j = 1, temp = 0; for (i = a[n-1][0];i > 0;--i) { temp += a[n-1][i] * (n+1); a[n][j++] = temp % 10; temp /= 10; } while (temp) { a[n][j++] = temp % 10; temp /= 10; } a[n][0] = --j; for (i = 0;++i <= j;--j) temp = a[n][j], a[n][j] = a[n][i], a[n][i] = temp; } int main() { int i; for (i = 3;i < N;Init(i++)); for (i = 1;i <= a[N-1][0];++i) printf("%d", a[N-1][i]); puts(""); return 0; }
#include <stdio.h> #define N 100 #define SIZE 200 int a[SIZE] = {1, 6}; void Init(int n) { int tmp[SIZE] = {0}; int i, j, result = 0; for (i = a[0], j = 0;i > 0;--i) { result += a[i] * (n+1); tmp[j++] = result % 10; result /= 10; } while (result) { tmp[j++] = result % 10; result /= 10; } a[0] = j; for (i = 1;--j >= 0;++i) a[i] = tmp[j]; } int main() { int i; for (i = 3;i < N;Init(i++)); for (i = 1;i <= a[0];++i) printf("%d", a[i]); puts(""); return 0; }