码迷,mamicode.com
首页 > 其他好文 > 详细

UVaOJ 112道题目-组合数学

时间:2014-12-05 22:41:10      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   使用   sp   

1、110601/10183 How Many Fibs? (斐波那契计数)

使用字符数组表示数列,double可以表示300位整数,但会出现精度问题。

bubuko.com,布布扣
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<ctype.h>
using namespace std;
struct NODE
{
    char dig[150];
}nod[1005];
char a[150],b[150];
void rever(char a[])
{
    int la=strlen(a);
    for(int i=0;i<la/2;i++)
        swap(a[i],a[la-1-i]);
}
int _strcmp(char a[],char b[])
{
    int la=strlen(a),lb=strlen(b),i;
    if(la!=lb)return la<lb?-1:1;
    for(i=la-1;i>=0;i--)
    {
        if(a[i]!=b[i])return a[i]>b[i]?1:-1;
    }
    return 0;
}
int main()
{
    strcpy(nod[1].dig,"1");
    strcpy(nod[2].dig,"2");
    int i=3,j,cnt,t1,t2;
    for(;;i++)
    {
        int len1=strlen(nod[i-2].dig);
        int len2=strlen(nod[i-1].dig);
        cnt=0;
        for(j=0;j<len1||j<len2;j++)
        {
            t1=0;
            t2=0;
            if(j<len1)
                t1=nod[i-2].dig[j]-0;
            if(j<len2)
                t2=nod[i-1].dig[j]-0;
            nod[i].dig[j]=(t1+t2+cnt)%10+0;
            cnt=(t1+t2+cnt)/10;
        }
        if(cnt!=0)
            nod[i].dig[j++]=cnt+0;
        nod[i].dig[j]=\0;
        if(j>100)break;
    }
    int tot=i;
    //sort(nod,nod+tot,cmp);
    while(scanf("%s",a)!=EOF)
    {
        scanf("%s",b);
        if(a[0]==0&&b[0]==0)break;
        cnt=0;
        rever(a);
        rever(b);
        for(i=0;i<tot;i++)
        {
            //printf("%s\n",nod[i].dig);
            if(_strcmp(a,nod[i].dig)>0)continue;
            if(_strcmp(b,nod[i].dig)<0)break;
            cnt++;
        }
        printf("%d\n",cnt);
    }
    return 0;
}
View Code

 

UVaOJ 112道题目-组合数学

标签:style   blog   http   io   ar   color   os   使用   sp   

原文地址:http://www.cnblogs.com/varcom/p/4147516.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!