加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

HDU 1316 大数二分

发布时间:2020-12-14 03:43:21 所属栏目:大数据 来源:网络整理
导读:建素数表 ?二分查找 ?练手用了。。 #include "stdio.h"#include "string.h"int f[5010][1010];int pk(int a[],int b[]){ int i; if (a[0]b[0]) return 1; if (a[0]b[0]) return -1; for (i=a[0];i=1;i--) { if (a[i]b[i]) return 1; if (a[i]b[i]) return -1

建素数表 ?二分查找 ?练手用了。。

#include "stdio.h"
#include "string.h"
int f[5010][1010];

int pk(int a[],int b[])
{
    int i;
    if (a[0]>b[0]) return 1;
    if (a[0]<b[0]) return -1;

    for (i=a[0];i>=1;i--)
    {
        if (a[i]>b[i]) return 1;
        if (a[i]<b[i]) return -1;
    }
    return 0;

}

int fi(int x[],int op)
{
    int l,r,mid,key;
    l=1;r=5000;
    while (l<=r)
    {
        mid=(l+r)/2;
        key=pk(x,f[mid]);
        if (key==1) l=mid+1;
        else if (key==-1) r=mid-1;
        else return mid;
    }

    if (op==1) return l;
    if (op==2) return r;
}

int main()
{
    int i,j,lea,leb,keya,keyb;
    int a[1201],b[1201];
    char stra[1201],strb[1201];
    memset(f,sizeof(f));
    f[1][0]=f[1][1]=f[2][0]=f[2][1]=1;
    for (i=3;i<=5000;i++)
    {
        for (j=1;j<=f[i-1][0];j++)
        f[i][j]=f[i-1][j]+f[i-2][j];
        f[i][0]=f[i-1][0];
        for (j=1;j<=f[i][0];j++)
        {
            f[i][j+1]+=f[i][j]/10;
            f[i][j]%=10;
        }
        if (f[i][f[i][0]+1]!=0) f[i][0]++;
    }
  //  printf("%dn",f[5000][0]);

    while (scanf("%s",stra)!=EOF)
    {
        scanf("%s",strb);
        if (stra[0]=='0' && strb[0]=='0') break;
        if (stra[0]=='0') stra[0]='1';
        a[0]=lea=strlen(stra);
        b[0]=leb=strlen(strb);
        for (i=0;stra[i];i++)
            a[lea-i]=stra[i]-'0';
        for (i=0;strb[i];i++)
            b[leb-i]=strb[i]-'0';

        keya=fi(a,1);
        keyb=fi(b,2);
        printf("%dn",keyb-keya+1);
    }

    return 0;

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读