2.1for循环
- 尽管for循环反复执行相同的语句,但这些语句每次执行效果往往不同
- 建议尽量缩短变量的定义范围。例如,在for循环的初始化部分定义循环变量
- 编写程序时要特别留意“当前行”的跳转和变量的改变
- 例题 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);
}
}
- 不拘一格的使用伪代码来思考和描述算法是一种值得推荐得到做法
- 把伪代码改写成代码时,一般先选择较为容易的任务来完成
- 浮点运算可能会有误差。在进行浮点数比较时,应考虑到浮点误差
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;
}
- 当需要统计某种事物的个数时可以用一个变量来充当计数器
- 不要忘记测试。一个看上去正确的程序可能隐含错误
- 在观察无法找出错误时可以用”输出中间结果“的方法查错
- C99并没有规定Int类型的确切大小但在当前流行的竞赛平台中int都是32位整数
- 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);
}