第二章 循环结构程序设计
笔记
for循环的格式为:for(初始化;条件;调整) 循环体;
尽量缩短变量的定义范围,在for循环的初始化部分定义循环变量,尽量不要定义名字相同的内外层变量。
break:直接跳出循环,往整体循环的下一步走
continue:跳回for循环的开始,执行调整语句并判断循环条件(即“直接进行下一次循环”,可以不必求出循环的起始点即“偷懒”)
while循环的格式:初始化;while(条件){循环体;调整;}
在观察无法找出错误时,可以用“输出中间结果”的方法查错!!!
在循环体开始定义的变量(例如累加器和累乘器),每次执行循环时会重新声明并初始化!!!!!啊啊啊不要忘记有时候要清零啊啊啊啊啊!!!!!
long long int的范围是-2的63次方~2的63次方-1(输入输出要改为%lld,有时有时%I64d)
le-6代表10的-6次方,即0.000001
要计算只包含加法、减法和乘法的整数表达式除以正整数n的余数,可以在每步计算之后对n取余,防止溢出,结果不变。
(double)a/b强制类型转换为双精度变量,%d有时候可以用来只输出整数部分。
分母有乘法的时候可以写成分子连除两个分母防止溢出,一定要注意结果没溢出但是中间计算结果溢出的情况!!
用乘10或除10来向右或向左移动小数点,有时候扩大之后的数在用完之后还要记得复原给下一次用……
单层的循环很少,一般都是双层循环来写,思路不要太局限,我怎么这么笨……
可以用数组来存放标记的数,后面也经常用到。
代码
这次的有参考大佬的
程序2-1 输出1,2,3,…,n的值
int n;
scanf("&d",&n);
for(int i=1;i<=n;i++)
printf("%d\n",i);
程序2-2 aabb问题(1)
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*n==n)
printf("%d\n",n);
}
程序2-3 aabb问题(2)
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-5 3n+1问题
int n2,count=0;
scanf("%d",&n2);
long long n=n2;
while(n>1)
{
if(n%2!=0)
{n=3*n+1;count++;}
else
{n=n/2;count++;}
}
printf("%d",count);
程序2-6 近似计算
double sum=0;
for(int i=0;;i++)
{
double term=1.0/(2*i+1);//注意规律
if(i%2==0)sum+=term;
else sum-=term;
if(term<0.000001) break;
}
printf("%.6f\n",sum);
程序2-7 阶乘之和(1)
int n,s;
scanf("%d",&n);
int sum=0;
for(int i=1;i<=n;i++)
{
int z=1;
for(int j=1;j<=i;j++)
z=j*z;
sum=z+sum;
}
printf("%d",sum % 1000000);
程序2-12 数据统计(改掉bug版)
int x,n=0,kase=0;
while(scanf("%d",&n)==1&&n)
{
while(n--)
{
int s=0,min=INF,max=-INF;
for(int i=0;i<n;i++)
{
scanf("%d",&x);
s+=x;
if(x<min) min=x;
if(x>max) max=x;
}
if(kase)
printf("\n");
printf("Case %d:%d %d %.3f\n",++kase,min,max,(double)s/n);
}
}
习题2-1 水仙花数
//2-1
int a,b,c,i;
for(i=100;i<=999;i++)
{
a=i/100;
b=i/10%10;
//b=i%100/10;
c=i%10;//这里是对10取余....... 怪不得只输出407
if(i==a*a*a+b*b*b+c*c*c)
printf("%d\n",i);
}
习题2-2 韩信点兵
//2-2
int a,b,c,count=0,i;
while(scanf("%d %d %d",&a,&b,&c)!=EOF)
{
count++;
for(i=10;i<=100;i++)
{
if(i%3==a&&i%5==b&&i%7==c)
printf("Case %d:%d\n",count,i);
else
if(i==101)
printf("Case %d:no.answer\n",count);
}
}
习题2-3 倒三角形
//2-3
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int t=1;t<i;t++)
{
printf(" ");
}
for(int j=1;j<=2*(n-i)+1;j++)
printf("#");
printf("\n");
}
习题2-4 子序列的和
//2-4
int n,m,count=0;
while(scanf("%d %d",&n,&m)!=-1&&n&&m)
{
count++;
double sum=0;
for(int i=n;i<=m;i++)
sum=1.0/i/i+sum;
printf("Case %d:%.5lf",count,sum);
}
习题2-5 分数化小数
//2-5
int a,b,c,count=0,x;
double d;
while(scanf("%d %d %d",&a,&b,&c)!=-1&&a&&b&&c)
{
count++;
printf("Case %d:%d.",count,a/b);
d=(double)a/b-a/b;
for(int i=1;i<=c;i++)
{
d=d*10;
x=(int)d;
if(c==i)
if(x>=5)
x++;
printf("%d",x);
d=d-x;
}
}
习题2-6 排列
//2-6
int a[9]={0},i,n,z,y,flag;
for(i=123;i<=329;i++)
{
flag=1;
y=i;
a[0]=y/100;a[1]=y/10%10;a[2]=y%10;
n=y*2;
a[3]=n/100;a[4]=n/10%10;a[5]=n%10;
z=y*3;
a[6]=z/100;a[7]=z/10%10;a[8]=z%10;
for(int j=0;j<9;j++)
{
for(int k=0;k<9;k++)
{
if(j==k) continue;
if(a[j]==a[k])
{
flag=0;break;
}
else
continue;
}
if(flag==0)
break;
}
if(flag==1&&a[1]&&a[2]&&a[3]&&a[4]&&a[5]&&a[6]&&a[7]&&a[8])
printf("%d %d %d\n",i,n,z);
else
continue;
}