<SPAN id="tt_tagDIV" style="word-break:break-all" class="tt_title">RPG Girls</SPAN>
RPG Girls
 
Rabbit Princess Grass!!!
 
 
    最新日志
·七种qsort排序方法 [转...(2006-09-24)
·Factstone Benc...(2006-09-20)
·N!问题(2006-09-17)
·毛毛,还我香蕉!!!(2006-09-15)
·小希的迷宫HDU1272(2006-09-14)
·用电脑最容易被忽视的18个危...(2006-09-13)
·1024 Max Max S...(2006-09-13)
·G要歇菜了! [原](2006-09-08)
·Last non-zero ...(2006-09-08)
·计算交点数HDU1466(2006-09-07)
·装错信封问题(2006-09-07)
·猜猜他们是谁~?~(2006-09-06)
·我们的第一次 [原](2006-09-06)
·RP不好啊!(2006-09-06)
·我们在一起 [原](2006-09-06)
·关于浮点数的存储 [转](2006-09-06)
·取石子游戏HDU1527 [...(2006-09-05)
    历史档案
    最新评论
wujita01/2008-04-04
ddddddddd....
访客/2008-01-12
ft
Louis.G/2007-09-27
你的解法基于划分,....
毛毛的同学(访客)/2007-04-30
晕死,我问毛毛这个....
不在现场(访客)/2007-02-06
这条公式到底是啥用....
Speakless(访客)/2006-11-17
这题都有..呵呵....
linle(访客)/2006-09-28
貌似楼上(还是楼下....
blogkid(访客)/2006-09-27
如果我没记错的话,....
草儿 (lasiazhang)/2006-09-24
为什么我贴的代码都....
访客857690/2006-09-09
恩,下次记得给我带....
访客429047/2006-09-08
可怜的人啊。。早知....
huangwei1024 (威士忌)/2006-09-07
欧拉原来是瑞士数学....
huangwei1024 (威士忌)/2006-09-06
不错不错
比我的好看....
访客913273/2006-09-06
恭喜RPG开张~

B....
访客772200/2006-09-06
挖哈哈哈哈哈,我是....
    友情链接
    我的LOGO
 
蓝色冰梦     加为好友   给我消息
性别:积分:
来自:年龄:21岁
Factstone Benchmark2006-09-20 01:44:25
标签:缩起正文  字号: 
::URL::http://192.168.100.16/showproblem.php?pid=1141
题意:
假设1960年出现了一部计算机只能容纳4-bit的数值数据
。接着以每10年为一个世代,数值范围皆为前一世代的两倍,如:1970为8-bit。若给定一年份,试找出在n!中,其数值可容纳于该年份之位数范围内最大的n值。
题意范例:
输入输出
19603
19818
199912
2160254016

解法:
暴力法建表求解
解法范例:
(1) 题意
年份1960197019801990200020102020
位数   4   8  16  32   64   128   256
年份203020402050  …2160
位数 51210242048 222
(2) 算法
n123 4  5  6   7    8  …
n!12624120720504040320
位数123 5  7 10  13   16
符合19601970 1980
(3) 找寻位数时,使用
log2(n!)=log2(1*2*3…*n)=log2(1)+log2(2)+…+log2(n)
(4) 为避免重复计算,因此建表使用之,如果做到需要的数,就独立出来。
使用,array[n]=array[n-1]+array[n];
n12345678…
log2(n)011.3+22.3+2.5+2.7+3
位数12357101316
程序:
/* 主程序部份 */
#include <stdio.h>

int main()
{
    int want;
    int result[23]={3,5,8,12,20,34,57,98,170,300,536,966,1754,3210,5910,
                    10944,20366,38064,71421,134480,254016};

    while(1)
    {
        scanf("%d",&want);
        if(want==0) break;
        
        printf("%d\n",(int)result[(want-1960)/10]);
    }
    
    return 0;
}

/* 建表部份 */
#include <stdio.h>
#include <math.h>

#define MAX 100000
#define Bit 50

int main()
{
    int i,j,tmp,want;
    double array1[MAX],result[50],buffer;
    
    for(i=0;i<MAX;i++) array1[i]=i+1;
    for(i=0;i<MAX;i++) array1[i]=log2(array1[i]);
    for(i=1;i<MAX;i++) array1[i]=array1[i-1]+array1[i];

    tmp=4;
    j=0;
    for(i=0;i<MAX;i++)
    {
        if(ceil(array1[i])>tmp){
            result[j]=i;
            j++;
            tmp=tmp*2;
        }
    }
    buffer=array1[MAX-1];
    
    for(i=0;i<MAX;i++) array1[i]=MAX+i+1;
    for(i=0;i<MAX;i++) array1[i]=log2(array1[i]);
    array1[0]=buffer+array1[0];
    for(i=1;i<MAX;i++) array1[i]=array1[i-1]+array1[i];
    
    for(i=0;i<MAX;i++)
    {
        if(ceil(array1[i])>tmp){
            result[j]=MAX+i;
            j++;
            tmp=tmp*2;
        }
    }
    buffer=array1[MAX-1];
    
    for(i=0;i<MAX;i++) array1[i]=2*MAX+i+1;
    for(i=0;i<MAX;i++) array1[i]=log2(array1[i]);
    array1[0]=buffer+array1[0];
    for(i=1;i<MAX;i++) array1[i]=array1[i-1]+array1[i];
    
    for(i=0;i<MAX;i++)
    {
        if(ceil(array1[i])>tmp){
            result[j]=2*MAX+i;
            j++;
            tmp=tmp*2;
        }
    }
    for(i=0;i<50;i++) printf("%d,",(int)result[i]);
    getchar();
    return 0;
}
回复() | 人气() | 引用() | 推荐 | 保存日志 | 问题日志 | 收藏到网摘 | 返回圈子首页
 
 
博客主页 博客主页 FAQ帮助 注册 退出