Problem 1
1,题意:数列An=2n(n<=100),每m个数输出一个平均值。
2,解题思路:首先将n个单位长度的数列存在数组里,结合循环进行求解。
如果n<=m时,利用公式直接求出结果。如果n>m时,每m个数进行计算后将和储存在sum中,用sum比上m求出前几项。当循环依次增加到n时,跳出循环,若n比m的余数为0,则此时储存的sum值除以m为最后一项,若n比m的余数不为0,则此时储存的sum值除以该余数为最后一项。
3,解题细节处理:注意每次储存值sum,使用完后应该重新赋值 0,数组也应重新初始化。本题中用到的特殊函数的头文件的添加,按照题目要求注意输出格式。
4,原码:
#include<iostream>
#include<cmath>
#include<cstring> //memset()函数的头文件//
using namespace std;
int a[100]; //主函数外定义数组,不用初始化//
int main()
{
int n, i, m, j, sum = 0, k = 1,x, t;
while (cin >> n >> m) //输入多组数值//
{
x=n%m; //获得n除以m的余数//
if(n>m)
{ t = m;
for (i = 1; i <= n; i++)
{ a[i] = 2 * i; } //将n个长度的An数列储存在数组中//
for (j = k; j < m + 1; j++)
{
sum = a[j] + sum; //利用用循环进行求解//
if (j == n)
break;
if (j == m)
{
sum = sum / t;
cout << sum << ' ';
k = k + t, m = m + t, sum = 0;
}
}
if(x!=0)
sum = sum /x; //余数不为0,则除以这个余数//
if(x==0)
sum=sum/t; //余数为0,则除以起初m赋值的t//
cout << sum << endl;
sum = 0; //对sum的重新赋值//
k = 1;
memset(a, 0, sizeof(a));} //对数组a初始化//
else if(n==m||n<m)
{cout<<(n*n+n)/n<<endl;}
}
}
5,总结:
由An是有规律的数列,首先想到用数组进行储存数值,又由题目进行多组数据的判断,应使用循环嵌套,然后结合条件判断进行计算。
Problem 2
1,题意: 判断输入的字符串是否为回文。
2,解题思路形成:将字符串储存字符数组里,用循环从数组的两侧进行判断是否一样,。
3,解题细节处理:注意进行循环语句时,数组是从0开始的。在判断字符数组中首尾字符是否一样时,利用goto语句使过程更简化。
4,原码:
#include<iostream>
#include<cstring> //用到此头文件//
using namespace std;
char m[3000]; //定义一个足够大的数组//
int main()
{
int n,i,j,sum=0;
cin>>n;
while(n--) //n不等于0即为真//
{
cin>>m; //依次输入n个字符串//
for(i=0;i<3000;i++)
{
if(m[i]!=0)
sum=sum+1; //求出每个字符串的长度//
else
break;
}
for(i=0,j=sum-1;i<j;i++,j--)
{
if(m[i]!=m[j])
{cout<<"no"<<endl; //判断首尾字符是否相同,若不同,跳到loop//
goto loop;}
}
cout<<"yes"<<endl; //若文件运行到此处,说明上述判断都成立,则输出结果//
loop: ;
sum=0; //对sum赋值0,确保下次循环不受影响//
memset(m,0,sizeof(0)); //对数组初始化//
}
return 0;
}
5,总结:
若对字符串结构进行相关操作时,一般情况下应该将字符串放到字符数组中,进行相关操作。
Problem 3
1,题意:母牛每年年初生一头小牛,小牛从第四年开始开始生小牛,求牛的总数;
2,解题思路形成:由题目容易看出应该使用递归算法,结合数组进行求解;
3,解题细节处理:由于题目的Sample Input 为2,4,5时,Sample Output分别2,4,6可猜想第一年年初应该没有生小牛,第二年才开始。数组的定义应为第一年的母牛为刚成熟,第二年为可生产。
4,原码:
#include<iostream>
int a[3] = { 0,1 ,0 }; //设置一个三个单位长度的数组,分别代表第三岁
using namespace std; 的,二岁的,一岁的母牛//
int main()
{
int n, t, i, sum = 0;
while (cin >> n&&n!=0) //输入年数,且0时停止运行//
{
for (i = 1; i <= n; i++)
{
t = a[0]; //成熟牛生产的小牛等于成熟牛的数给t//
a[0] = a[0] + a[1]; //二岁牛也成熟,并到a[0]中//
a[1] = a[2]; //一岁牛成长为二岁牛,赋值给a[1]//
a[2] = t; //生产的小牛数给a[2]//
}
sum = (a[0] + a[1] + a[2] ) ; //计算牛的总数//
cout << sum << endl;
sum = 0;
a[0] = 0, a[1] = 1, a[2] = 0; //初始化数值,a[1]=1,为下次计算使用//
}
}
5,总结:解决此类问题时,应该首先想到递推和数组结合,注意数值的变化。再对整体求和得出结果。
Problem 4
题意:如下图所示的蜂房,一个不能反向爬行的蜜蜂从a到b,求其路线数。
2,解题思路形成:蜜蜂从a到b,从b开始算起,若想到b位置,只能从b-1或b-2位置爬过来,所以也应该用递归算法。定义数组进行求解。
解题细节处理:此题可以将系统所包含的蜂房数即从1到49之间的每次走法都算出来,用1到b减去1到a,也可对每次a到b进行计算。但任需注意数值的变化和数组初始化。
原码:
#include<iostream>