| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1970 人关注过本帖
标题:[学习笔记]从循环到穷举~~
只看楼主 加入收藏
qwe885167759
Rank: 4
等 级:业余侠客
威 望:5
帖 子:148
专家分:259
注 册:2013-3-12
收藏
得分:0 
回复 17楼 不才
你宏定义都不要用,不是更简单吗?

我本楚狂人,凤歌笑孔丘
2013-04-25 17:35
夜太美
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2013-4-25
收藏
得分:0 
好厉害啊
2013-04-25 18:00
Ryker
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:145
专家分:420
注 册:2013-2-19
收藏
得分:0 
程序代码:
/* 一维数组练习:一

 * 旅馆里有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;
}


[ 本帖最后由 Ryker 于 2013-4-26 12:04 编辑 ]
2013-04-26 11:50
Ryker
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:145
专家分:420
注 册:2013-2-19
收藏
得分: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);
}
2013-04-26 14:17
我叫沃恩
Rank: 12Rank: 12Rank: 12
来 自:Asia
等 级:贵宾
威 望:10
帖 子:1234
专家分:3865
注 册:2013-3-29
收藏
得分:0 
我也来进步!

因为我是菜鸟,所以应该被骂! 细节+坚持=成功!
2013-04-26 15:02
Ryker
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:145
专家分:420
注 册:2013-2-19
收藏
得分:0 
程序代码:
/* 二维数组练习:二

 * 在上下对齐的数中用大数减小数并输出

 * 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;
}
2013-04-26 15:15
Ryker
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:145
专家分:420
注 册:2013-2-19
收藏
得分:0 
核心部分进位控制没写出来...我自己是用了个判断,当数组中某位大于1000的时候才进位... 算法没想明白,结果总是在中间多几个0..

参考了版主的进位控制...

程序代码:
/*精确计算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;
}


[ 本帖最后由 Ryker 于 2013-4-27 14:34 编辑 ]
2013-04-27 14:32
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
a[n][0]存储位数

程序代码:
#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;
}


[fly]存在即是合理[/fly]
2013-04-27 18:44
Ryker
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:145
专家分:420
注 册:2013-2-19
收藏
得分:0 
回复 28楼 azzbcc
二维数组对我来说现在还搞不清楚...

下标的变化我还对应不到应该是哪一位...
2013-04-28 08:51
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分: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;
}


[fly]存在即是合理[/fly]
2013-04-28 12:45
快速回复:[学习笔记]从循环到穷举~~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020526 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved