题目来源:
人们在非洲列朋波山脉的一个岩洞中发现了个骨头,是古人刻痕计数用的,尼克每天背一首诗,并模仿古人在木棒上刻一条痕。连续刻了五天后,问有多少条刻痕。
给一个比较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;
}
(为了使用兑数器,把函数加上返回值,累加方法是正确的,用来做其他函数的参考基数,您可以自行改下)
扩展,可以把当天吃的树叶数量比前一天多改成动态的,还可以把问题改成第N天吃了多少,N 让用户输入。
感兴趣的同学,可以改变下,自己把程序补充完整!