第二章 循环结构程序设计
Posted chichu-chen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二章 循环结构程序设计相关的知识,希望对你有一定的参考价值。
1. 函数 double floor(double x) 向下取整,返回不超过x的最大整数;函数 double ceil(double x) 向上取整,返回不小于x的最小整数。若给定的数为整数,则返回该整数。按理说返回的是整数,函数类型应该是int ,但据codeblocks提示,函数类型为double 。头文件 math.h
2. eg2-1:输出所有形如aabb的4位完全平方数(前两位数字相等,后两位数字也相等)。代码如下:
#include<iostream> #include<cmath> using namespace std; 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) cout<<n<<endl; } return 0; }
其中,对于减少浮点运算带来的误差的方法值得学习。(浮点运算误差来自于计算机存储浮点数的方式),当然,此题用枚举可避开开方。
3. int32_t:4字节的整型数,uint32_t:无符号4字节的整型数。
4. 对于 long long 型的输入,有时为:"%lld",有时为:"%I64d",10的-6次方写为:1e-6
5. 要计算只包含加法、减法和乘法的整数表达式除以正整数n的余数,可以在每一步计算之后对n取余,结果不变。
6.<time.h> <ctime> 计时函数clock() 返回程序到目前为止运行的时间。这个时间除以常数CLOCKS_PER_SEC之后得到的值以”秒“为单位。该常数与操作系统相关。
7. 熟悉Windows和Linux的命令行操作。
8. 在Windows下,输入完毕后先按下Enter,再按CTRL+Z,最后按下Enter结束输入。再Linux下,输入完毕后按CTRL+D结束输入。
9.输入输出重定向及自动删除等。
10. 设计程序时考虑程序的鲁棒性(robustness)。
11. 当嵌套的两个代码块中由同名变量时,内层的变量会屏蔽外层变量,有时会引起十分隐蔽的错误。
#include<iostream> using namespace std; int main() { int a=10; for(int i=0;i<1;i++) { int a=1; cout<<a<<endl; } cout<<a<<endl; return 0; }
输出为:1 10
12. 水仙花数:(daffofil)输出100到199中的所有水仙花数。若3位数ABC满足ABC=A*A+B*B+C*C,则称其为水仙花数,eg:153=1*1+5*5+3*3,所以是水仙花数。
#include<iostream> using namespace std; int main() { for(int i=100;i<1000;i++) if ( (i % 10) * (i % 10) * (i % 10) + (i / 10 %10) * (i / 10 %10) * (i / 10 %10) +(i / 100) * (i / 100) * (i / 100) == i ) cout<<i<<endl; return 0; }
13. 韩信点兵(hanxin):相传韩信聪明过人,从不直接清点自己的军队人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠过一眼队伍的排尾就知道总人数了。输入包括多组数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。
输入样例:
2 1 6
2 1 3
输出样例:
Case 1: 41
Case 2:No answer
//解法1:枚举
#include<iostream> using namespace std; int main() { int a,b,c; while(cin>>a) { cin>>b>>c; for(int i=10;i<=100;i++) { if((i-a)%3==0 && (i-b)%5==0 && (i-c)%7==0) { cout<<i<<endl; break; } else if(i==100) cout<<"No answer"<<endl; } } return 0; }
//解法2: //原理:剩余定理。特征数分别为70、21、15 #include<iostream> using namespace std; int main() { int a,b,c; while(cin>>a) { cin>>b>>c; int num=(70*a+21*b+15*c)%105; if(num<=100&&num>=10) cout<<num<<endl; else cout<<"No answer"<<endl; } return 0; }
14. 倒三角形(triangle):给定一个n,输出一个n层的倒三角形。例如n=5时输出如下:
#include<iostream> using namespace std; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) //输出空格 cout<<" "; for(int j=1;j<=2*(n-i)+1;j++) //输出# cout<<"#"; cout<<endl; } return 0; }
15. 子序列的和(subsequence):输入两个正整数n<m<1e-6,输出1/n^2+1/(n+1)^2+...+1/m^2,保留5位小数。输入包含多组数据,结束标记为n=m=0。提示:本题有陷阱。
样例输入:
2 4
65536 655360
0 0
样例输出:
Case 1:0.42361
Case 2:0.00001
#include<iostream> #include<iomanip> //输出精度 using namespace std; int main() { int m,n,Case=0; double sum; while(cin>>n) { sum=0; cin>>m; if(m==0&&n==0) break; for(int i=n;i<=m;i++) sum+=(double)1/i/i; cout<<"Case "<<++Case<<":"<<fixed<<setprecision(5)<<sum<<endl; //set...控制位数,有fixed为小数点后开始,没有则由最高位开始 } return 0; } //此题的陷阱就是如果除以n^2会溢出,所以要除两次。另外一种解决方法是类型为long long型
16.分数化小数(decimal):输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b<=1e6,c<=100。输入包含多组数据,结束标记为a=b=c=0。
样例输入:
1 6 4
0 0 0
样例输出
Case 1:0.1667
//由于c的值为<100,所以不能简单的用double进行存储输出。
#include<iostream>
using namespace std;
int main()
{
int a,b,c,Case=0;
int result[101]; //存储对应小数位的值
while(cin>>a)
{
cin>>b>>c;
if(a==0&&b==0&&c==0) //结束输入
break;
int integer=a/b;
int re=a%b;
for(int i=0;i<=c;i++) //计算小数值
{
result[i]=(re*10)/b;
re=(re*10)%b;
}
if(result[c]>=5) //>=5,则进位
{
if(c>=0) result[c-1]++;
else integer++;//c为0
for(int i=c-1;i>=0;i--)
{
if(result[i]>=10) //进位的处理
{
result[i]=result[i]%10;
if(i-1>=0) result[i-1]++;
else integer++;
}
}
}
cout<<"Case "<<++Case<<":"<<integer;
if(c!=0) cout<<".";
for(int i=0;i<c;i++)
cout<<result[i];
cout<<endl;
}
return 0;
}
//解决问题:c是否为0,每一位上是否需要进位
17. 排列(permutation):用1,2,3,……,9组成的3个三位数abc,def 和 ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。
#include<iostream> using namespace std; int main() { int a[10]; for(int i=123;i<=329;i++) //abc最小为123,最大为987/3==329 { int sum=0; for(int m=1;m<=9;m++) //初始化为0 a[m]=0; int j=2*i,k=3*i; //j=def,k=ghi a[i/100]=a[(i%100)/10]=a[i%10]=1; //使用的数对应位置为1,否则为0 a[j/100]=a[(j%100)/10]=a[j%10]=1; a[k/100]=a[(k%100)/10]=a[k%10]=1; for(int m=1;m<=9;m++) //说明都使用过了一次 sum+=a[m]; if(sum==9) cout<<i<<" "<<j<<" "<<k<<endl; } return 0; }
以上是关于第二章 循环结构程序设计的主要内容,如果未能解决你的问题,请参考以下文章