模拟(impelementation)
- 把自然语言转换为机器语言,当找不到好的算法时,题目如何描述就怎么解题。
- 注意:弄清题意,建立模型,注意细节。
例题:
数组实现:利用公式(p+m-1)%n,找出要输出数组的下标
其中p为开始报数的人的编号,n为当前剩下的人数
void Joseph(int n,int m)
{
int a[100],k=0,p=0;
for(int i=0;i<n;i++) a[i]=i+1;
while(n>1)
{
p=(p+m-1)%n;
cout<<"第"<<++k<<"个出圈的是:"<<a[p]<<endl;
for(int j=p+1;j<n;j++) a[j-1]=a[j];
n--;
if(p==n) p=0;
}
cout<<"最后剩下的是:"<<a[p]<<endl;
}
暴力
暴力就是枚举,指的是从问题所有可能的解的集合中一一枚举个元素。
优点:算法简单,在局部地方使用枚举法,效果会十分好。
缺点:运算量过大,当问题的规模变大时,循环的阶数越大,执行速度越慢。计算量容易过大,所以需要先计算时间复杂度。
有时候题中给出某些数据的范围时,可以写一个简单的程序算一下运算次数,计算时间复杂度,例如下: