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

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

  • 水仙花数
    • 题目:若三位数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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值