| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1174 人关注过本帖
标题:uva 763 斐波拉茨进制问题 RE!!求错点
只看楼主 加入收藏
brian1994
Rank: 2
来 自:广东省中山市一中
等 级:论坛游民
帖 子:63
专家分:47
注 册:2011-5-15
结帖率:75%
收藏
已结贴  问题点数:10 回复次数:14 
uva 763 斐波拉茨进制问题 RE!!求错点
費氏數列的處理,一向都是相當地費事。當然今天也不例外。各 位應該有聽說過費式數列,或許沒有聽過以費式數列為基底的數字表示法吧!費氏數列基本上就是 (1,1,2,3,5,8,...),定義第零項、第一項都是1,自第二項起,每一項的數值皆等於前兩項的和。接下來我們來考慮費氏進位制:

說得單純一些,就是我們考慮將一個正整數 X 表示成費氏數列當中某些不重複項的和。例如

35 = 1 + 34 = 1 + 13 + 21 = 1 + 5 + 8 + 21 = 1 + 2 + 3 + 8 + 21

看起來有很多種表示法對吧?但若我們規定「選出來的數字不能有相鄰的項」,那麼一切就會變得簡單些了,例如:

35 = 1 + 34
30 = 1 + 8 + 21
28 = 2 + 5 + 21
12 = 1 + 3 + 8
7 = 2 + 5

巧合的是,可以證明恰好只有一種這樣的表示方法。

我們可以用類似二進位數的方法來表達這樣的一個正整數在「費氏進位制」底下長的樣子。

不過,現在費事的地方來了,我們要怎麼樣對兩個「費氏進位」的數字作加法呢?

這就是你的工作,給你兩個以費氏進位制 的數字,你必須把他們加起來,並且用費氏進位制表示出來。

 输入说明 :
每兩行為一組測資,每個長度不會超過100個,每組測資以空白隔開

 输出说明 :
請輸出結果,並每兩組之間空一行隔開

 范例输入 :

10010
1

 10000
1000

 10000
10000


 范例输出 :
10100

 100000

 100100

我的代码:
#include<cstdio>
#include<cstring>
int ans[1001],a[1001],b[1001];
int l,la,lb;
char s[1001],t[1001];

void fill()
{
     memset(ans,0,sizeof(ans));
     memset(a,0,sizeof(a));
     memset(b,0,sizeof(b));
     memset(t,0,sizeof(t));
}

void init()
{
     scanf("%s",t); getchar();
     //s->a
     la=strlen(s);
     for (int i=la;i>=1;i--) a[i]=s[la-i]-'0';
     while (!a[la] && la>1) la--;
     //t->b
     lb=strlen(t);
     for (int i=lb;i>=1;i--) b[i]=t[lb-i]-'0';
     while (!b[lb] && lb>1) lb--;
}

void find()
{
     //a
     for (int i=la;i>=1;i--)
       if (a[i]>0 && a[i+1]>0) {a[i]--; a[i+1]--; a[i+2]++;}
     while (a[la+1])
     {
           if (a[la]>0 && a[la+1]>0) {a[la]--; a[la+1]--; a[la+2]++;}
           la++;
     }
     //b
     for (int i=lb;i>=1;i--)
       if (b[i]>0 && b[i+1]>0) {b[i]--; b[i+1]--; b[i+2]++;}
     while (b[lb+1])
     {
           if (b[lb]>0 && b[lb+1]>0) {b[lb]--; b[lb+1]--; b[lb+2]++;}
           lb++;
     }
     //ans
     if (la>lb) l=la; else l=lb;
     for (int i=1;i<=l;i++) ans[i]=a[i]+b[i];
     
     for (int i=1;i<=l;i++)
       while (ans[i]>0 && ans[i+1]>0) {ans[i]--; ans[i+1]--; ans[i+2]++;}
     while (ans[l+1])
     {
           while (ans[l]>0 && ans[l+1]>0) {ans[l]--; ans[l+1]--; ans[l+2]++;}
           l++;
     }
}

void doit()
{
     //first
     for (int i=1;i<=l;i++)
     {
         while (ans[i]>0 && ans[i+1]>0) {ans[i]--; ans[i+1]--; ans[i+2]++;}
         while (ans[i]>=2 && i>1) {ans[i+1]++; ans[i-2]++; ans[i]-=2;}
     }
     while (ans[l+1])
     {
           while (ans[l]>0 && ans[l+1]>0) {ans[l]--; ans[l+1]--; ans[l+2]++;}
           l++;
           while (ans[l]>=2 && l>1) {ans[l+1]++; ans[l-2]++; ans[l]-=2;}
     }
     //ans[0] ans[1] special
     if (ans[0]==1) {ans[1]++; ans[0]--;}
     if (ans[1]>=2) {ans[2]+=ans[1]/2; ans[1]%=2;}
     //second
     for (int i=1;i<=l;i++)
     {
         while (ans[i]>0 && ans[i+1]>0) {ans[i]--; ans[i+1]--; ans[i+2]++;}
         while (ans[i]>=2 && i>1) {ans[i+1]++; ans[i-2]++; ans[i]-=2; i=i-2;}
     }
     while (ans[l+1])
     {
           while (ans[l]>0 && ans[l+1]>0) {ans[l]--; ans[l+1]--; ans[l+2]++;}
           l++;
           while (ans[l]>=2 && l>1) {ans[l+1]++; ans[l-2]++; ans[l]-=2;}
     }
     if (ans[0]==1) ans[1]++;
     //output
     for (int i=l;i>=1;i--) printf("%d",ans[i]); printf("\n\n");
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while (scanf("%s",s)!=EOF)
    {
          fill();
          init();
          find();
          doit();
    }
    return 0;
}
搜索更多相关主题的帖子: uva 
2011-05-15 15:52
brian1994
Rank: 2
来 自:广东省中山市一中
等 级:论坛游民
帖 子:63
专家分:47
注 册:2011-5-15
收藏
得分:0 
#include<cstdio>
#include<cstring>
int ans[1001],a[1001],b[1001];
int l,la,lb,tt=0;
char s[1001],t[1001];

void fill()
{
     memset(ans,0,sizeof(ans));
     memset(a,0,sizeof(a));
     memset(b,0,sizeof(b));
     memset(t,0,sizeof(t));
}

void init()
{
     if (tt) printf("\n");
     scanf("%s",t); getchar();
     //s->a
     la=strlen(s);
     for (int i=la;i>=1;i--) a[i]=s[la-i]-'0';
     while (!a[la] && la>1) la--;
     //t->b
     lb=strlen(t);
     for (int i=lb;i>=1;i--) b[i]=t[lb-i]-'0';
     while (!b[lb] && lb>1) lb--;
}

void find()
{
     //a
     for (int i=la;i>=2;i--)
       if (a[i]>0 && a[i-1]>0) {a[i]--; a[i-1]--; a[i+1]++;}
     while (a[la+1])
     {
           la++;
           if (a[la]>0 && a[la-1]>0) {a[la]--; a[la-1]--; a[la+1]++;}
     }
     //b
     for (int i=lb;i>=2;i--)
       if (b[i]>0 && b[i-1]>0) {b[i]--; b[i-1]--; b[i+1]++;}
     while (b[lb+1])
     {
           lb++;
           if (b[lb]>0 && b[lb-1]>0) {b[lb]--; b[lb-1]--; b[lb+1]++;}
     }
     //ans
     if (la>lb) l=la; else l=lb;
     for (int i=1;i<=l;i++) ans[i]=a[i]+b[i];
     
     for (int i=l;i>=2;i--)
       while (ans[i]>0 && ans[i-1]>0) {ans[i]--; ans[i-1]--; ans[i+1]++;}
     while (ans[l+1])
     {
           l++;
           while (ans[l]>0 && ans[l-1]>0) {ans[l]--; ans[l-1]--; ans[l+1]++;}
     }
}

void doit()
{
     if (ans[1]>=2) {ans[2]+=ans[1]/2; ans[1]%=2;}
     //first
     for (int i=2;i<=l;i++)
     {
         while (ans[i]>0 && ans[i-1]>0) {ans[i]--; ans[i-1]--; ans[i+1]++;}
         while (ans[i]>=2) {ans[i+1]++; ans[i-2]++; ans[i]-=2;}
     }
     while (ans[l+1])
     {
           l++;
           while (ans[l]>0 && ans[l-1]>0) {ans[l]--; ans[l-1]--; ans[l+1]++;}
           while (ans[l]>=2) {ans[l+1]++; ans[l-2]++; ans[l]-=2;}
     }
     //ans[0] ans[1] special
     if (ans[0]==1) {ans[1]++; ans[0]--;}
     if (ans[1]>=2) {ans[2]+=ans[1]/2; ans[1]%=2;}
     //second
     for (int i=l;i>=2;i--)
     {
         while (ans[i]>0 && ans[i-1]>0) {ans[i]--; ans[i-1]--; ans[i+1]++;}
         while (ans[i]>=2) {ans[i+1]++; ans[i-2]++; ans[i]-=2; /*i=i-2;*/}
     }
     while (ans[l+1])
     {
           l++;
           while (ans[l]>0 && ans[l-1]>0) {ans[l]--; ans[l-1]--; ans[l+1]++;}
           while (ans[l]>=2) {ans[l+1]++; ans[l-2]++; ans[l]-=2;}
     }
     if (ans[0]==1) ans[1]++;
     //output
     for (int i=l;i>=1;i--) printf("%d",ans[i]); printf("\n");
     tt++;
}

int main()
{
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    while (scanf("%s",s)!=EOF)
    {
          fill();
          init();
          find();
          doit();
    }
    return 0;
}
2011-05-15 16:41
brian1994
Rank: 2
来 自:广东省中山市一中
等 级:论坛游民
帖 子:63
专家分:47
注 册:2011-5-15
收藏
得分:0 
现在错了!!!
2011-05-15 16:42
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:5 
做什么?
2011-05-15 16:54
brian1994
Rank: 2
来 自:广东省中山市一中
等 级:论坛游民
帖 子:63
专家分:47
注 册:2011-5-15
收藏
得分:0 
斐波拉茨进制加法
2011-05-15 16:56
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
两次的结构一样啊
2011-05-15 17:05
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
你的不同吗  在我上面是一样的结果前后
2011-05-15 17:05
brian1994
Rank: 2
来 自:广东省中山市一中
等 级:论坛游民
帖 子:63
专家分:47
注 册:2011-5-15
收藏
得分:0 
因为第一次没有处理第一位... ...处理了第一位后会影响结果,又算一次...
2011-05-15 17:06
buffer
Rank: 5Rank: 5
等 级:职业侠客
帖 子:73
专家分:326
注 册:2010-12-31
收藏
得分:5 
LZ是台湾同胞?能不能用简体描述一下题目啊?
2011-05-15 17:18
brian1994
Rank: 2
来 自:广东省中山市一中
等 级:论坛游民
帖 子:63
专家分:47
注 册:2011-5-15
收藏
得分:0 
我是内地孩子... ...
网上没有简体字翻译,找了另一个版本,将就看吧...
//-------------------------------------------------
標準的2進位數1010若算成10進位的話是8+2=10。你有沒有想過如果我們用費伯那西數(Fibonacci numbers)來取代2的指數,情況會是如何呢?在此問題中,費伯那西數列:1,2,3,5,8,13,21,34,......你可以發現數列中的每一項都是前2項的和(當然,第1項=1和第2項=2是基本的定義)。以上面的例子1010來說的話,若以費伯那西數為基底的話,就可以得到1*5+0*3+1*2+0*1=7。我們稱這樣的表達方式為Fibinary Number。

我們也發現了,有的數可以以不只一種Fibinary Number來表示。例如:10進位的10可以以8+2(10010)或5+3+2(1110)這2種Fibinary Number來表示。為了要使某數以唯一的Fibinary Number來表示,我們規定盡可能的使用較大的費伯那西數(也就是說,不允許有相連的1存在)。以上面的例子10來說,應該以8+2(10010)來表示。

Input

每組測試資料2列。各有1個合法的Fibinary Number。長度最大為100個字元。

測試資料間空一列。

Output

對每一組測試資料,請輸出該2個Fibinary Number相加的結果(以Fibinary Number的形式)。測試資料間亦請空一列。
2011-05-16 13:17
快速回复:uva 763 斐波拉茨进制问题 RE!!求错点
数据加载中...
 
   



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

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