《算法竞赛入门经典》第二章习题答案

#define LOCAL
#include<iostream>
#include<fstream>
#include<ctime>
#include<iomanip>
using namespace std;
 
int main()
{
    //阶乘问题
    /*
    int n,s = 0;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        int temp = 1;
        for (int j = 1; j <= i; j++)
            //temp *= j;
            temp = (temp * j) % 1000000;
        cout << i << "的阶乘为" << temp << endl;
        s += temp;
    }
    cout << s << endl;
    cout << s % 1000000 << endl;
    cout << "Time used:" << (double)clock() / CLOCKS_PER_SEC << endl;
    */
     
    //2-1 位数问题
//重定向版本
/*  
#ifdef LOCAL
    freopen("2_1.in","r",stdin);
    freopen("2_1.out","w",stdout);
#endif LOCAL
    int num;
    while(cin >> num)
    //while(scanf("%d",&num)==1)
    {
        int count = 0;
        for (int i = pow(10,9); i >= 1; i /= 10)
        {
            if ((num / i) != 0)
            {
                cout << "当前正整数的位数为: " << 10 - count << endl;  
                break;
            }
            count++;
        }
    }*/
 
    //标准读写文件操作
    /*
    ifstream fin("2_1.in");
    ofstream fout("2.1.out");
    if (!fin)
        cout << "文件打不开!" << endl;
    int num;
    while(fin >> num)
    //while(scanf("%d",&num)==1)
    {
        int count = 0;
        for (int i = pow(10,9); i >= 1; i /= 10)
        {
            if ((num / i) != 0)
            {
                fout << "当前正整数的位数为: " << 10 - count << endl;  
                break;
            }
            count++;
        }
    }
    fin.close();
    fout.close();
    */
 
    //2_2 水仙花问题
/*
#ifdef LOCAL
    freopen("2_2.in","r",stdin);
    freopen("2_2.out","w",stdout);
#endif LOCAL
    */
    //创建输入文本
    /*
    int n = 0;
    ofstream fin("2_2.in");
    for (int i = 100; i < 1000; i++)
    {
        fin << i << " ";
        n++;
        if (n == 10)
        {
            n = 0;
            fin << endl;
        }
    }*/
    /*
    int num;
    while (cin >> num)
    {
        int k3,k2,k1;
        k1 = num % 10;
        k2 = (num % 100) / 10;
        k3 = num / 100;
        if (num == (pow(k1,3) + pow(k2,3) + pow(k3,3)))
            cout << "这是一个水仙花数: " << num << endl;
    }*/
    //2_3 韩信点兵问题
    /*
    int k3,k5,k7;
    while (cin >> k3 >> k5 >> k7)
    {
        int temp;
        for (int i = 10; i <= 100; i++)
        {
            temp = i;
            if ( ((i%3)== k3) && ((i%5)== k5) && ((i%7)== k7) )
            {
                cout << "当前的总兵数为: " << i << endl;
                break;
            }
        }
        if (temp == 100)
            cout << "No answer" << endl;
    }*/
    //2_4 倒三角形问题
/*  
#ifdef LOCAL
freopen("2_4.in","r",stdin);
freopen("2_4.out","w",stdout);
#endif LOCAL
    int m;
    while (cin >> m)
    {
        int count = 0;
        for (int i = m; i >= 1; i--)
        {
            if (i == m)
            {
                for (int j = 1; j <= 2 * i - 1; j++)
                    cout << "#" << " ";
                cout << endl;
                count ++;
            }
            else
            {
                for (int k = 1; k <= 2 * count; k++)
                    cout << " ";
                for (int j = 1; j <= 2 * i - 1; j++)
                    cout << "#" << " ";
                cout << endl;
                count++;
            }
             
        }
         
    }*/
    //2_5 统计问题
    //重定向版本
/*
#ifdef LOCAL
    freopen("2_5.in","r",stdin);
    freopen("2_5.out","w",stdout);
#endif LOCAL
    int m;
    while (cin >> m)
    {
        int n,temp,count=0;
        int *p = new int[m];
        for (int i = 0; i < m; i++)
        {
            cin >> n;
            p[i] = n;
        }
        cin >> temp;
        for (int j = 0; j < m; j++)
            if (p[j] < temp)
            {
                cout << p[j] << " ";
                count++;
            }
        cout << "共有" << count << "个数符合条件" << endl;
    }
    cout << "Time used:" << (double)clock() / CLOCKS_PER_SEC << endl;*/
 
    //标准文件读写版本
/*
    ifstream fin("2_5.in");
    ofstream fout("2_5.out");
    int m;
    while (fin >> m)
    {
        int n,temp,count=0;
        int *p = new int[m];
        for (int i = 0; i < m; i++)
        {
            fin >> n;
            p[i] = n;
        }
        fin >> temp;
        for (int j = 0; j < m; j++)
            if (p[j] < temp)
            {
                fout << p[j] << " ";
                count++;
            }
        fout << endl;
        fout << "共有" << count << "个数符合条件" << endl;
    }
    fout << "Time used:" << (double)clock() / CLOCKS_PER_SEC << endl;
    fin.close();
    fout.close();*/
 
    //2_6 调和级数问题
    /*
    int n;
    while (cin >> n)
    {
        double H = 0.0;
        for (int i = 1; i <= n; i++)
            H += double(1)/i;
        cout << "调和级数的值为:" << fixed << setprecision(3) << H << endl;
    }*/
 
    //2_7 近似计算问题
/*
    double sum = 0.0;
    for (int i = 1;;i++)
    {
        if ((1.0/(2*i - 1)) >= pow(10,-6))
        {
            if ((i+1) % 2 == 0)
                sum += 1.0/(2*i - 1);
            else
                sum -= 1.0/(2*i - 1);
            cout << "当前项为: " << fixed << setprecision(8) << 1.0/(2*i - 1) << endl;
        }
        else
        {
            if ((i+1) % 2 == 0)
                sum += 1.0/(2*i - 1);
            else
                sum -= 1.0/(2*i - 1);
            cout << "符合条件的最小项为: " << 1.0/(2*i - 1) << endl;
            break;
        }
    }
    cout << "在当前条件下,近似数为: " << sum << endl;*/
     
    //2_7 子序列的和问题
    /* 
    本题陷阱在于当N很大时,N的平方会溢出
    改为1/N/N就好 
    */
    /*
    int n,m;
    cin >> n;
    cin >> m;
    double sum = 0.0;
    for (int i = n; i <= m; i++)
        sum += 1.0/n/n;
    cout << "子序列的和为:" << fixed << setprecision(12) << sum << endl;*/
 
    //2_8 分数化小数问题
    //非数组版
    /*
    int a,b,c;
    cin >> a;
    cin >> b;
    cin >> c;
    int temp,temp2;
    if (a < b)
    {
        temp = a * 10 / b;
        temp2 = a * 10 % b;
        cout << "0." << temp;
        while (c != 1)
        {
            temp = temp2 * 10 / b;
            temp2 = temp2 * 10 % b;
            cout << temp;
            c--;
        }
        cout << endl;
    }
    else if (a > b)
    {
        int temp3 = a % b;
        temp = temp3 * 10 / b;
        temp2 = temp3 * 10 % b;
        cout << "0." << temp;
        while (c != 1)
        {
            temp = temp2 * 10 / b;
            temp2 = temp2 * 10 % b;
            cout << temp;
            c--;
        }
        cout << endl;
    }
    else
        cout << "a与b相等" << endl;*/
 
    //2_9 排列问题
    int a[10] = {0};
    int def,ghi;
    for (int abc = 100; abc < 333; abc++)
    {
        int sum = 0;
        def = 2*abc;
        ghi = 3*abc;
        a[abc/100] = a[abc/10%10] = a[abc%10] = 1;
        a[def/100] = a[def/10%10] = a[def%10] = 1;
        a[ghi/100] = a[ghi/10%10] = a[ghi%10] = 1;
        for (int i = 0; i < 10; i++)
            sum += a[i];
        if (sum == 9)
            cout << abc << " " << def << " " << ghi << endl;
        for (int i = 0; i < 10; i++)
            a[i] = 0;
    }
 
    system("pause");
    return 0;
}


你可能感兴趣的:(《算法竞赛入门经典》第二章习题答案)