竞赛备战一 循环结构程序设计
---恢复内容开始---
一:前言
1. 本人最近在备战竞赛的时候突然想把自己的所学所得写出来,希望由大佬看到的时候能帮我纠正一下。
2.程序设计不是看会的,也不是课堂上听会的,使练会的;听懂了明白了我就想看看我自己来写能不能写出来;从简单的写起看看自己能写出多少。
4.本人新手,若此文章被大佬看到还希望指点一二。
二:循环结构程序设计。
1.这也是刚入门学的东西了,入门一年的时候自认为自己写出来的也挺多的,可越发涉猎越发觉得自己的对这些知识的无法完全掌握,在读到很多前辈的作品和他们的想法时,会被他们的思路深深打动,不由感叹其精妙之处;佩服之余还是会想到如何让自己融会贯通将其转变成自己的东西以供之后使用。就像循环结构是之前早早的学会的东西了,可大佬们总能运用的更好,我可能现在看到了了解了但是真正用的时候又无法将其使用出来。特写此文。
2.for循环基本介绍:
for循环是我们最早接触的循环之一,基本格式为
for(表达式1;表达式2;表达式3)
在该循环中需要注意的是表达式1,2,3都可以被省略,若都省略,则该循环为无限循环,格式为: for( ; ; )
表达式1一般是一个变量的定义或者已经声明的变量的定义.
表达式2一般是一个循环的条件,比如变量 i<=9 .
表达式3一般是对表达式1中的变量的状态的描述,也就是当一次循环结束后,表达式1中的变量会有什么改变。
3.for循环实战:
(1). 7744问题:
编写一个程序,用来输出所有的aabb型的4位数,且该4位数是完全平方数。
个人分析:
不难看出这是一个简单的用于巩固基础的程序设计,我们定义了 i , j ;再通过 printf("%d%d%d%d\n",i,i,j,j); 即可输出所有的aabb型数据,通过分支条件判断出哪些是完全平方数将其输出即可完成,那么问题就是如何能精准的判断哪个数是不是完全平方数呢?
函数sqrt() 的作用是开方,可我们需要的数是整数(参考完全平方数概念),于是函数floor()就起到作用了,该函数可以得到不超过某个数的最大整数。当我们用floor()得到的整数平方;若得到的结果与开方之前相等,即为完全平方数。代码编写如下:
方法一:
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k;
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
{
k=i*1100+j*11;
int n = sqrt(k);
int m = floor(n+0.5); # 此处n+0.5是为了防止浮点数或者函数计算时出现误差导致结果出错,选择0.5是因为四舍五入的原理。
if(m*m==k)
printf("%d\n",k);
}
}
编译运行结果:
方法二:方法一通过开方来解决问题,那么方法二就可以通过平方来解决问题,定义一个x来对其进行平方,当这个整数x平方后能得到一个4位数aabb型,则该aabb型数即为我们需要的数。
程序如下:
#include<stdio.h>
int main()
{
int x,n,m,k;
for(x=1; ;x++)
{
n=x*x;
if(n<1000) continue;
if(n>9999) break; //直接筛选数字为4位数的数。
m=n%100;
k=n/100; //分离前两位数和后两位数。
if(m%10==m/10&&k%10==k/10)
printf("%d\n",n);
}
return 0;
}
编译结果如下

不难看出,当我们遇到这种遍历的问题时,for循环帮助了我们很大的忙,另外,熟练掌握其他的方法并且融合在一起使用会使得我们再程序设计时事半功倍。比如在方法二中如果我们从1一直遍历执行循环就会很浪费时间,所以不如用continue 直接判断之后再决定是否进行,再者就是数的无穷性,倘若不给出一个限定,那么这个循环必将无限执行下去,所以我们用break来直接跳出循环。
4.while循环 和 do while 循环
当我们掌握for 循环时 ,不要一味的沉浸于掌握一个方法的喜悦中,此时我们应该考虑一下该种方法的局限性:
(1)从上面的例子不难看出,for循环时,我们的对象 n 是在递增或者递减的,那如果我们遇到一个循环,对象n是先增再减或者先减后增的呢?
(2)再者,for循环的次数是明确的,n从我们定义的那一个数开始,一直到我们的限定条件使得循环次数是确定的,问题是那我们遇到循环次数不确定的怎么办呢?
针对以上问题,我们引入while循环来解决问题,首先先来看一个例子。
实例:对于任意大于1 的自然数n,若n为奇数,则把n变成3n+1;否则变为n的一半,经过若干次这样的变化,总会使n变为1.
分析:由题意可知,该循环是根据n的大小来决定的,故无固定的循环次数;再者n并不是会一直递增或者递减的,解决这种题目我们想到的肯定有循环,但此时我们就无法使用for循环.
此处我们不在具体介绍while循环的语法,各位看官可以从粗黑字的地方看出for循环和while循环的使用条件和不同之处并给我指出我的不足之处.
程序设计如下:
#include<stdio.h>
int main()
{
int n,i,j;
scanf("%d",&n);
while(n>1)
{
if(n%2==0)
n=n/2;
else
n=3*n+1; //当n循环到1时,结束循环。
}
printf("%d",n);
return 0;
}
编译运行结果:

看起来这个程序时成功了,但如果我们输入一个比较大的数时,这个程序还适用吗?
运行一下:
很遗憾出错了,这里的问题主要来自于整数溢出的问题,这个问题是不容忽视的问题,由于本文是对循环做研究,所以就只是单纯的提出来让大家注意也让自己注意一下,具体想了解整数溢出问题的可以去看看官方的解释,或者有大佬专门撰文解释的,有兴趣的读者可以自行搜索学习.
5.两种循环的相同之处(不同处见上方加粗黑体部分)
for(初始化;条件;调整)
while(条件)
{
循环体;
调整;
}
6:处女座就这么完美谢幕了,易建联谢谢你.文章若有不足之处欢迎各位大佬指正.
---恢复内容结束---

浙公网安备 33010602011771号