第二章 循环结构程序设计

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 \n 10 \n

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;
}

猜你喜欢

转载自www.cnblogs.com/chichu-chen/p/10126864.html