求问个c语言问题,请问这题应该用怎样的算法

如题所述

用递归算法。
分析如下:
第一天:1
第二天:1
第三天:2 = 1+1
第四天:4 = 2+2
第五天:7 = 4+3
第六天:11 = 7+4
第七天:16 = 11+5
......
从第三天起,数量是前一天的数量再加上(天数-2)
由此可写出递归算法如下:
int getNumber(int day) //day代表第几天
{
if (day < 3) return 1;//day<3时,返回1
retrun getNumber(day - 1) + (day - 2); //day>=3时,返回前一天的数量 + (天数 - 2)
}追问

在吗 没太明白啊

追答

唉,气死了,本来打了一大段文字,结果网页卡住了,全没了,还得重新打~
不好意思,前面的回答有误,是我开始理解错了,正确理解如下:
第一天:1(记为A0)
第二天:1(A0)
第三天:1(A0) + A0复制的1(记为B0) = 2
第四天:1(A0) + 1(B0) + A0复制的1(记为C0) = 3
第五天:1(A0) + 1(B0) + 1(C0)+ A0复制的1(记为D0) + B0复制的1(E0) = 5
.......
其实这是个斐波那契数列。
斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)

追问

这道题我把它看成两天一天复制一次可以吗 简化运算

追答

你这样理解会好一些:
假如第n-2天的数量为M,那么到第n天(对于从第n-2天算起,第三天就是第n天),这些M个数量全部都会复制出新的一份。
因此从第三天起,每天复制出来的数量是正好是第(n-2)那天的数量,那么第n天的数量就是前一天的数量(第n-1天的数量) + 复制的数量(即第n-2天的数量)

追问

可以看成等比数列吗

2的n次方

可是这样做跟答案比差太多了

追答

这就是个斐波那契数列啊,运算公式就是Fn=F(n-1)+F(n-2),写成函数就是下面这样:
int getNumber(int day) //day代表第几天
{
if (day < 3) return 1;//day<3时,返回1
retrun getNumber(day - 1) + getNumber(day - 2);
}

追问

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-12-20

下面的程序模仿了东西的复制过程。


其中a代表“年龄”为1天的东西,b代表年龄为2天的东西,c代表年龄为3天及以上的东西,

a+b+c代表聚宝盆东西的总数。

#include<stdio.h>
#include<stdlib.h>

int main(){
    int a,aa,b,bb,c,cc;
    int i,n;
    a=1;
    b=0;
    c=0;
    aa = 0;
    bb = 0;
    cc = 0;
    printf("%d\t%d\t%d\t%d\n",a,b,c,a+b+c);
    for(i=2;i<=12;i++){
        if( a >= 1){
            bb = a;
            a = 0;
        }
        if( b >= 1 ){
            cc = b;
            b=0;
        }
        if(cc>=1 || c >= 1){
            aa = c+cc;
        }
        a = a + aa;
        b = b + bb;
        c = c + cc;
        aa = 0;
        bb = 0;
        cc = 0;
        printf("%d\t%d\t%d\t%d\n",a,b,c,a+b+c);
    }
    system("pause");
    return 0;
}

 

第2个回答  2014-12-18
总结出一个计算公式就搞定了。
第3个回答  2014-12-18
等比数列求和追问

不太明白 具体说下好吗

追答

第一天1个,过三天2个,再过三天4个,再过三天8个....首项1,公比2,学过等比数列么。然后键盘输入n的值传给函数,在输出就好了。

鸡生蛋的问题

很久不学c语言了代码肯定写不了。

追问

这是直接能看出来的规律吗

还是需要先写在纸上自己找规律

第4个回答  2014-12-18
然后指数运算。追问

没懂啊 具体说下好吗

追答

把三天翻一倍转成一天翻一倍比较好弄

所以用n%3

然后循环。

每次翻一番。

追问

c++?

追答

这是一种语言

建立在c上的

你应该看得懂。

追问

你写的代码我在c文件上敲可以吗

追答

格式不一样不可以。

你最好自己整理一下语句。

如果用的是c加加编译器是可以的。

追问

我就没懂

你这i是余数啊

用余数循环有什么意义

追答

用错了。

追问

应该是倍数对吗

那多那几天怎么办啊 不算了?

追答

不算

因为没用。

追问

这是一种什么思想啊 好高深

追答

多出来的那几天不会多出东西。

所以不用考虑。

追问

不对啊 输入n为三时输出1

可答案应该是2

追答

你写了×2的循环语句了没

还有,number初始值为1

我下了

要是还有问题,明天再回答。

追问

你看下我这段代码可以吗

还在吗 这么想不对啊

当n等于45时正确答案已经过十亿了

而这么算的话才几万

追答

你是在扯淡吗?45的时候到二十几万。

不对。45的时候当然是几万

你输入1,3,6试试

看是不是1,2,4

第5个回答  2014-12-18
n%3
相似回答