虫宝宝吃树叶

250 阅读3分钟

题目来源:

人们在非洲列朋波山脉的一个岩洞中发现了个骨头,是古人刻痕计数用的,尼克每天背一首诗,并模仿古人在木棒上刻一条痕。连续刻了五天后,问有多少条刻痕。

给一个比较low的答案,如下:

void m3013(){
    cout<<"第五天后,是"<<5<<"条刻痕。"<<endl;
}

改编,增加难度如下:

新出生的虫宝宝,虫宝宝每天都在长大,每天的胃口也在变大,第一天吃1片树叶,第二天吃2片树叶,第三天吃3片,第四天吃4片树叶 ... ...

求到了第十天一共吃了多少片树叶?

解法一(累加法):

void m3013_a(){
    int num,sum,n;
    num =0; // 表示每天吃的树叶数量
    sum=0;  // 表示到了第N天,一共吃的树叶数量
    n=10;   // 第几天
    for(int i=1;i<=n;i++){
        num+=1;
        sum = sum+num;
    }
    cout<<" 到了第 "<<n<<" 天,虫宝宝一共吃了 "<<sum<<" 片树叶。"<<endl;
}

解法二(简便计算法):

void m3013_b(){
    // num 第一天和计算式的最后一天 加载一起吃了多少片
    // sum 是 day 天一共吃了多少片
    // times 表示 除以2 后有多少次
    // remain 表示计算时候最后一天吃多少片,如果天数是偶数 则是0 如果是奇数则是最后一天吃的数量
    int num,sum,day,times,remain;
    num =0;
    sum=0;
    times=0;
    remain=0;

    day=1;  // 调整 这个参数来验证

    // 1+2+3+4+5+6+7+8 = (1+8) + (2+7) + (3+6) +(4+5) = 8/2 * (1+8)
    // 1+2+3+4+5+6+7+8  + 9 = (1+8) + (2+7) + (3+6) +(4+5)  +9  = 8/2 * (1+8) + 9
   if(0 != day%2){
        remain = day;
        day--;
    }
    num=1+day;
    times=day/2;

    sum = num * times + remain;
    cout<<" 到了第 "<<day<<" 天,虫宝宝一共吃了 "<<sum<<" 片树叶。"<<endl;
}

解法三(数列公式法):

void m3013_c(){
    //当天比前一天多吃1片树叶,是等差数列 an = a1 + (n-1)d , sn = n * a1 + n(n-1)d /2
    int a1,n,d,sn;
    a1=1; // a1 第一天吃了树叶数量
    d=1; // d 当天比前一天多吃的树叶数量
    sn=0; // sn 到了N 天,一共吃了多少片树叶

    n =10; //n 到了第n 天  调整第几天
    sn = n * a1 + (n*(n-1)*d) /2;

    cout<<" 到了第 "<<n<<" 天,虫宝宝一共吃了 "<<sn<<" 片树叶。"<<endl;
}

main 函数中调度,测试结果 如下:

int a=m3013_a();
int c=m3013_c();
cout<<"_a函数测试结果=="<<a<<",_c函数测试结果=="<<c<<endl;

if(a==c){
    cout<<"算法正确!"<<endl;
} else {
    cout<<"算法不正确!"<<endl;
}

(为了使用兑数器,把函数加上返回值,累加方法是正确的,用来做其他函数的参考基数,您可以自行改下)

image.png

扩展,可以把当天吃的树叶数量比前一天多改成动态的,还可以把问题改成第N天吃了多少,N 让用户输入。

感兴趣的同学,可以改变下,自己把程序补充完整!