| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 17883 人关注过本帖, 8 人收藏
标题:第四届蓝桥杯本科B组C语言题
只看楼主 加入收藏
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
+1

仰望星空...........不忘初心!
2013-05-09 12:17
sala0127
Rank: 2
等 级:论坛游民
帖 子:56
专家分:52
注 册:2011-11-8
收藏
得分:0 
+1,大数除法我还没写过呢。。
2013-05-09 20:55
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
两位。算上27楼,三位。

哦,还没感谢楼主赠分呢

重剑无锋,大巧不工
2013-05-09 21:03
i_code
Rank: 2
等 级:论坛游民
帖 子:19
专家分:15
注 册:2013-5-2
收藏
得分:0 
+1,我也想知道,写一下吧。
2013-05-09 21:56
sala0127
Rank: 2
等 级:论坛游民
帖 子:56
专家分:52
注 册:2011-11-8
收藏
得分:0 
回复 33楼 beyondyf
是我应该感谢B版大神才对,好的思路想法的价值可比这100分远远高出许多。
2013-05-09 21:58
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,四位了,看来我该准备一下代码了。

重剑无锋,大巧不工
2013-05-09 22:04
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
搞定。

先把代码发上来,待第5位出现再详细解释吧

简单解释一下还是需要的。算法中小数是以定点数的方式处理的,用char型数组存储。其中第0位表示小数的个位,其它位为小数点后的部分。

宏ACC为精度参数,修改它可以改变想精确到的小数点后的位数。当然,不要太大,这个算法比较基础,针对黄金分割数的计算效率一般,时间复杂度大概介于O(n^2)到O(n^3)之间。算一百位在我的机器上大约需要150ms。

程序代码:
#include<stdio.h>

#define ACC        100
#define N        ACC + 2

int cmp(char * a, char * b, int n)
{
    int i;
    for(i = 0; i < n; i++)
        if(a[i] != b[i]) return a[i] - b[i];
    return 0;
}

int sub(char * a, char * b, int n)
{
    int f;
    for(f = 0 ; --n >= 0; f = a[n] < 0 ? (a[n] += 10, 1) : 0)
        a[n] -= b[n] + f;
}

void div(char * a, char * b, char * c, int n)
{
    int i, j;
    for(i = 0; i < n; i++)
    {
        for(c[i] = 0; cmp(a, b, n) >= 0; c[i]++) sub(a, b, n);
        a[0] = a[0] * 10 + a[1];
        for(j = 1; j < n - 1; j++) a[j] = a[j + 1];
        a[n - 1] = 0;
    }
}

void golden_number(char * x, int n)
{
    char * p, * a, * b, * c, * t;
    int i;

    p = (char *)malloc(n * 3);
    a = p; b = a + n; c = b + n;

    for(i = 0; i < n; c[i++] = 0);

    do{
        t = a; a = c; c = t;
        for(i = 0; i < n; b[i] = a[i++]);
        a[0] += 1;
        b[0] += 2;
        div(a, b, c, n);
        b[0] -= 2;
    }while(cmp(b, c, n));

    for(i = 0; i < n; x[i] = c[i++]);
    free(p);
}

void output(char * x, int n)
{
    int i;
    printf("%d.", x[0]);
    for(i = 1; i < n; printf("%d", x[i++]));
}

int main()
{
    char x[N];
    int i;

    golden_number(x, N);
    if(x[N - 1] >= 5) for(i = N - 2; i >= 0 && ++x[i] > 9; x[i--] = 0);
    output(x, N - 1);
    return 0;
}

重剑无锋,大巧不工
2013-05-09 22:32
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
该下线了,晚安各位

重剑无锋,大巧不工
2013-05-09 22:43
dishitian
Rank: 1
等 级:禁止发言
帖 子:9
专家分:4
注 册:2013-4-3
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2013-05-10 10:27
罗庇鹏ksq
Rank: 5Rank: 5
来 自:太平洋
等 级:职业侠客
帖 子:220
专家分:310
注 册:2012-6-30
收藏
得分:0 
第五位  

从来都是无所谓,现在也该学着有所谓。✿咱们一个人,别坐井观天❀
2013-05-10 14:52
快速回复:第四届蓝桥杯本科B组C语言题
数据加载中...
 
   



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

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