算法竞赛入门经典 第二章部分习题

目录

 

1、习题2-5   分数化小数(decimal)

2、习题2-6 排列


 

1、习题2-5   分数化小数(decimal)

输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b≤106,c≤100。

输 入包含多组数据,结束标记为a=b=c=0。


样例输入:
1 6 4
0 0 0


样例输出:
Case 1: 0.1667
 

#include 
#include 

int main ()
{
    int a, b, c, cnt = 0;
    while(scanf("%d%d%d", &a, &b, &c) != EOF)
    {
        if(a == 0 && b == 0 && c == 0)
            break;
        else
        {
            int i = floor((double)a/b);
            printf("Case %d:%d.", ++cnt, i);
            int j = a-i*b;
            for(int k = 1; k < c; k++)
            {
                i = floor(j*10/b);
                j = j*10-i*b;
                printf("%d", i);
            }
            i = floor((double)j*10/b + 0.5);
            printf("%d", i);
            printf("\n");
        }
    }

    return 0;
}

 

 

 

2、习题2-6 排列

用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解.

 

我最开始想的是直接遍历判断,但是感觉麻烦。后来发现如果设置i为最小的数,判断i*3<1000,再接着分解每一位数字,把出现的数字存到一个数组里面,记录出现的次数,如果大于2则表示不行。

但是依然很麻烦。于是百度一下,发现一个大神的做法,惊艳到了我。 膜拜去了~~

 

大神思路:

两个关键点:

1、i 最小只能是123, 最大只能是329(因为最大数字只能是987)
2、1~9加起来能是45, 1~9乘起来只能是362880

所以我们可以将前面的i, j, k分别分解出来的9位数字相加, 相乘, 
看最后的结果是不是45,362880。

 

原文链接:https://zhidao.baidu.com/question/1829939023362385740.html

#include 
using namespace std;

void result(int num, int &result_add, int &result_mul)
{
    int i, j, k;

    i = num / 100;        //百位
    j = num / 10 % 10;    //十位
    k = num % 10;         //个位

    result_add += i + j + k;    //分解出来的位数相加
    result_mul *= i * j * k;    //相乘
}

int main()
{
    int i, j, k;
    int result_add, result_mul;

    for(i = 123; i <=329; i++)
    {
        j = i * 2;
        k = i * 3;

        result_add = 0;
        result_mul = 1;

        result(i, result_add, result_mul);
        result(j, result_add, result_mul);
        result(k, result_add, result_mul);

        if(result_add == 45 && result_mul == 362880)
            printf("%d %d %d\n", i, j, k);
    }
    return 0;
}

 

你可能感兴趣的:(算法入门)