回复 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;
}
