算法竞赛入门经典(第二版)第二章循环结构程序设计例题与提示上

2.1for循环

  1. 尽管for循环反复执行相同的语句,但这些语句每次执行效果往往不同
  2. 建议尽量缩短变量的定义范围。例如,在for循环的初始化部分定义循环变量
  3. 编写程序时要特别留意“当前行”的跳转和变量的改变
  • 例题 2-1 aabb

输出所有形如aabb的4位完全平方数。
-伪代码
for(int a=1;a<9;a++)
for(int b=0;b<9;b++)
if(aabb是完全平方数)printf("%d\n",aabb)

int main()
{ for(int a=1;a<=9;a++)
  for(int b=0;b<=9;b++)
  {
  int n=a*1100+b*11;
  int m=floor(sqrt(n)+0.5);
  if(m*m==n)printf("%d\n",n);
  //一般改成四舍五入,即floor(x+0.5),因为在大量计算后由于误差整数1变成了0.999999999,floor的结果会是0而不是1
}
//用枚举思路平方根x从而避免开平方的操作
int main()
{ for(int x=1;;x++)
  { int n=x*x;
    if(n<1000) continue;
    if(n>9999)break;
    int hi=n/100;
    int lo=n%100;
    if(hi/10==hi%10&&lo/10==lo%10)printf("%d\n",n);
  }
}
  1. 不拘一格的使用伪代码来思考和描述算法是一种值得推荐得到做法
  2. 把伪代码改写成代码时,一般先选择较为容易的任务来完成
  3. 浮点运算可能会有误差。在进行浮点数比较时,应考虑到浮点误差

2.2 while循环和do-while循环

  • 例题2-2 3n+1问题

猜想:对于任意大于1的自然数n,若n为奇数,则将n变为3n+1,否则变为n的一半。经过若
干次这样的变换一定会使n变为1.例如,3-10-5-16-8-4-2-1

//有bug版本:乘法溢出了int整数的范围即-2^31~2^31-1,可以通过Long long解决问题但要把%d改%lld
int main()
{  int n,count=0;
scanf("%d",&n);
while(n>1)
  {  if(n%2==1)n=n*3+1;
     else n/=2;
     count++;  
  }
 printf("%d\n",count);
 rerurn 0;
}
  1. 当需要统计某种事物的个数时可以用一个变量来充当计数器
  2. 不要忘记测试。一个看上去正确的程序可能隐含错误
  3. 在观察无法找出错误时可以用”输出中间结果“的方法查错
  4. C99并没有规定Int类型的确切大小但在当前流行的竞赛平台中int都是32位整数
  5. long long 在linux下输入输出格式符为%lld,但windows有时为%164d。为保险起见可用c++
  • 例题2-3近似计算

计算∏/4=1-1/3+1/5-1/7+…,直到最后一项小于10^-6

int main()
{  double sum=0;
    for(int i=0;;i++)
    { double term=1.0/(i*2+1);
    if(i%2==0)  sum+=term;
    else sum-=term
    if(term<le-6)break;
    }
    printf("%.6f\n",sum);
}

猜你喜欢

转载自blog.csdn.net/qq_43233736/article/details/83011280
今日推荐