算法竞赛入门经典——习题2.5

来源:互联网 发布:nginx部署webpack项目 编辑:程序博客网 时间:2024/06/05 22:51

好久前买了《算法竞赛入门经典》,想着学习算法。一直拖到今天才开始做题……
所以开了个文件,把这里面的习题做完后都放上来,也方便以后回看。

  • 水仙花数
    • 题目:若三位数ABC满足ABC = A3+B3+C3,则称ABC为水仙花数。输出100~999中的所有水仙花数。
    • 代码:
//水仙花数void Daffodil(){    for (int i=1; i<=9; i++)    {        for (int j=0; j<=9; j++)        {            for (int k=0; k<=9; k++)            {                int left = i*100 + j*10 + k;                int sum = pow(i,3)+pow(j,3)+pow(k,3);                if (left==sum && 100<=sum && sum<1000)                {                    printf("%d=%d^3+%d^3+%d^3\n",sum,i,j,k);                                    }            }        }    }}
  • 韩信点兵
    • 题目:给定一个正整数模3,5,7的三个余数,求[10,100]以内满足条件最小的数
    • 代码:
//韩信点兵 int Hanxin(const int& a, const int& b, const int& c){    for (int i=10; i<=100; i++)    {        if (i%3==a && i%5==b && i%7==c)        {            return i;        }    }    return 0;}
  • 倒三角形

    • 题目:输入n,输出n层的倒三角形
    • 代码:
      //倒三角形 void triangle(const int& n){    int row = n, col = 2*n-1;    for (int i=0; i<n; i++)    {        for (int j=0; j<col; j++)        {            if (j<i || j>=col-i)                            printf(" ");                        else                printf("*");        }        printf("\n");    }}
  • 子序列的和

    • 题目:输入n<m<106,输出1/n2+1/(n+1)2++1/m2的值,保留5位小数。
    • 代码:
      //子序列的和double subsequence(const int& n, const int& m){    double ans = 0;    for (int i=n; i<=m; i++)    {        double x = (double)i/100;        ans +=(1.0 / (x*x));    }    return ans/10000;}
  • 分数化小数

    • 题目:输入a,b,c,输出a/b的小数形式,精确到小数点后c位。c<=100。
    • 代码:
      void decimal(const int& a, const int& b, const int& c){    int digit = c, last1 = 0, last0 = 0;    int m = a / b, r = a % b;    printf("%d.",m);    while(r!=0)    {        //update r        int pwd = 0;        while (r<b)        {            r *=10;            pwd++;        }        // 补零         for (int i=1; i<pwd; i++)        {               if(digit > 1)                printf("0");            else if (digit == 1)                 last1 = 0;            else if (digit == 0)                last0 = 0;            digit--;            if (digit < 0)            {                printf("0");                return;            }         }        m = r / b;        if (digit > 1)            printf("%d",m);        else if (digit == 1)            last1 = m;        else if (digit == 0)            last0 = m;        r %=b;        digit--;        if (digit < 0) break;           }    if (r <= 0)    {        while (digit--)        {            printf("0");        }        printf("\n");        return;    }    if (last0 >= 5) last1++;    printf("%d\n",last1);}
  • 排列

    • 题目:用1~9组成3个三位数abc,def和ghi,每个数字恰好使用一次。要求abc:def:ghi=1:2:3,输出所有满足的组合。
    • 分析:搞了很久都没做出来,后来上网搜了一下。感谢牛人,原来此题关键在于1~9这九个数字的和只能是45,积只能是362880,所以用这个条件很快就找到了~
    • 代码:
      void permutation(){    for (int i=123; i<=329; i++)    {        int f = i, s = 2*i, t = 3*i;        int add=0, mul=1;               getResult(f,add,mul);        getResult(s,add,mul);        getResult(t,add,mul);        //1~9加起来只能是451~9乘起来只能是362880        if (add==45 && mul==362880)            printf("%d %d %d\n",f,s,t);    }} void getResult(int val, int& add, int& mul){    int MOD = 10;    for (int i=1; i<=3; i++)    {        add +=(val%MOD);        mul *=(val%MOD);        val /=MOD;    }}

以上,便是第一篇记录(难得贴了6道题。。。果然还是题目太简单了)

0 0
原创粉丝点击