# 第2章 循环结构程序设计

## 2.1 for循环

#include <stdio.h>
#include <math.h>
int main()
{
double square;
for(int i = 1000; i <= 9999; i++){ //尽量缩短变量的定义范围，在for循环的初始化部分定义循环变量
square = floor(sqrt(double(i)) + 0.5);
if(i%10 == i%100/10 && i/100%10 == i/1000 && square*square == i)
printf("%d ",i);
}
printf("\n");
return 0;
}

#include <stdio.h>
#include <math.h>
int main()
{
for(int a = 1; a < 10; a++){  //a从1开始，因为是四位数
for(int b = 0; b < 10; b++){
int n = a * 1100 + b *11;
int m = floor(sqrt(double(n)) + 0.5);
if(m*m == n) printf("%d ", n);
}
}
printf("\n");
return 0;
}

#include <stdio.h>
#include <math.h>
int main()
{
for(int square = 1; ; square++){
int n = square*square;
if(n < 1000) continue;
if(n > 9999) break;
if(n%10 == n%100/10 && n/100%10 == n/1000)
printf("%d ", n);
}
printf("\n");
return 0;
}

## 2.2 while循环和do-while循环

#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
long long n1 = n;
int count = 0;
while(n1 > 1)
{
if(n1 % 2 == 0) n1 = n1/2;
else n1 = 3*n1 + 1;
count++;
}
printf("%d\n", count);
return 0;
}

#include <stdio.h>
int main()
{
double pi = 0.0, temp, t = 1.0;
int i = 1;
do{
temp = 1.0/i;   //注意分子为1.0，此时才能进行浮点数运算，若写成1，temp的值将为1或者0，得不到正确结果
pi += temp*t;
t = -t;
i += 2;
}while(temp >= 1e-6);   //注意10^-6的写法
printf("%.6f\n", pi);
return 0;
}

## 2.3 循环的代价

#include <stdio.h>
#include <time.h>
int main()
{
const int MOD = 1000000;
int n;
scanf("%d", &n);
double t1 = (double)clock() / CLOCKS_PER_SEC;  //循环体开始执行前时间，防止将键盘输入时间计算在内
int S = 0;
for(int i = 1; i <= n; i++){
int factorial = 1;
for(int j = 1; j <= i; j++){
factorial = factorial * j % MOD;
}
S = (S + factorial) % MOD;            //没进行一次乘法或者加法，都要对MOD取余，使结果尽可能小
}
printf("%d\n", S);
printf("Time used = %.6f\n", (double)clock() / CLOCKS_PER_SEC - t1); //使用clock()和CLOCKS_PER_SEC来计算时间差（秒）
return 0;
}

## 2.4 算法竞赛的输入输出框架

#include <stdio.h>
#include <cstdlib>
int main()
{
int x, count = 0;
double s = 0;
int min = INT_MAX, max = INT_MIN;  //也可以先输入一个x，然后令max = min = x；
while(scanf("%d", &x) != EOF){  //scanf("%d", &x) == EOF
if(x > max) max = x;
if(x < min) min = x;
s += x;
count++;
}
printf("%d %d %f\n", min, max, s/count);
return 0;
}
scanf遇到回车键时将数据从缓冲区送到程序，例如输入5， 8， 9， 14， 16，按回车键，再按crtl + z键结束输入后，程序运行最终结果

#include <stdio.h>
#define INF 100000000
int main()
{
int x, n, kase = 0, min, max;
while(scanf("%d", &n) == 1 && n)  //如果程序鲁棒性强，有时能在数据有瑕疵的情况下仍然给出正确的结果
{
max = -INF;
min = INF;
int s = 0;
for(int i = 0; i < n; i++){
scanf("%d", &x);
s += x;
if(x < min) min = x;
if(x > max) max = x;
}
printf("Case %d: %d %d %.3f\n", ++kase, min, max, (double)s/n);
}
return 0;
}

## 2.5 注解和习题

<span style="font-size:10px;">#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double n,m;
int kase=0;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
cout<<"Case "<<++kase<<": ";
double sum=0;
for(int i=n;i<=m;i++)
{
double temp=1.0/(i*i);
sum+=temp;
}
cout<<setiosflags(ios::fixed)<<setprecision(5)<<sum<<endl;
}
return 0;
}</span>

<span style="font-size:10px;">#include <iostream>
using namespace std;
int ans1[110],ans2[110];
int main()
{
int a,b,c;
int kase=0;
while(cin>>a>>b>>c)
{
if(a==0&&b==0&&c==0) break;
cout<<"Case "<<++kase<<": ";
ans1[0]=a;
ans2[0]=a/b;
for(int i=1;i<=c+1;i++)
{
ans1[i]=ans1[i-1]%b*10;  //存放每次的除数
ans2[i]=ans1[i]/b;       //存放每次的商
}
if(ans2[c+1]>=5)             //进位
{
ans2[c]=ans2[c]+1;
int i=c;
while(ans2[i]==10)
{
if(--i>0)
ans2[i]=ans2[i]+1;
else break;
ans2[i]=0;
}
if(ans2[1]==10) {ans2[1]=0; ans2[0]++;}   //修改整数位
}
cout<<ans2[0]<<".";
for(int i=1;i<=c;i++)
cout<<ans2[i];
cout<<"\n";
}
return 0;
}</span>

#include <stdio.h>
int  main(void)
{
int i, j, k;
int i1, i2, i3;
int j1, j2, j3;
int k1, k2, k3;
int c, count;
for (i = 123; i <= 329; i++) {
j = i*2;
k = i*3;
i1 = i/100, i2 = i/10%10; i3 = i%10;
j1 = j/100, j2 = j/10%10; j3 = j%10;
k1 = k/100, k2 = k/10%10; k3 = k%10;
for (c = 1; c != 10; c++) {
count = 0;
if (c == i1)
count++;
if (c == i2)
count++;
if (c == i3)
count++;
if (c == j1)
count++;
if (c == j2)
count++;
if (c == j3)
count++;
if (c == k1)
count++;
if (c == k2)
count++;
if (c == k3)
count++;
if (count > 1)
break;
}
if (c == 10 && i2 != 0 && i3 != 0 && j2 != 0 && j3 != 0 && k2 != 0 && k3 != 0)
printf("%d %d %d\n", i, j, k);
}
return 0;
}  

#### c 程序设计（谭浩强 四版）

2017年09月16日 3.25MB 下载

#### 第4章 循环结构程序设计

2012年01月04日 403KB 下载

#### C语言教程9第二版）

2008年12月03日 3.47MB 下载

11-12 1075

11-13 643

08-04 1902

#### VisualBasic教程PPT

2011年12月07日 4.47MB 下载

03-29 396

03-01 481

06-06 1745