zoukankan      html  css  js  c++  java
  • HDU2541_Simple Addition Expression

    /*
    *Time: 93ms
    *题目大意:
    *        求i+(i+1)+(i+2)的结果对于有没有进位,没有进位的称为Simple Addition Expression
    *        给定一个n,求i < n有多少个数可以称为simple Addition Expression.
    *解题思路:
    *        总共有786432个符合要求的数据。所以可以用暴力。
    *        求出所有的满足的simple Addition Expression的数。之后用二分查找位置即可。
    */
    View Code
      1 #include <iostream>
      2 #include <algorithm>
      3 #include <iterator>
      4 using namespace std;
      5 
      6 const int MAX = 1000000;
      7 int num[10], cnt;
      8 __int64 res[MAX];
      9 
     10 __int64 arrayToInt64(int arr[], int n)
     11 {
     12     __int64 digit = 1, sum = 0;
     13     for(int i = n; i >= 0; i--)
     14     {
     15         sum += arr[i] * digit;
     16         digit *= 10;
     17     }
     18     return sum;
     19 }
     20 
     21 void dfs(int digit)
     22 {
     23     if(digit != 9)
     24     {
     25         for(int i = 0; i < 4; i++)
     26         {
     27             num[digit] = i;
     28             dfs(digit + 1);
     29         }
     30     }
     31     else
     32     {
     33         for(int i = 0; i < 3; i++)
     34         {
     35             num[digit] = i;
     36             res[cnt++] = arrayToInt64(num, digit);
     37         }
     38     }
     39 
     40     return ;
     41 }
     42 
     43 void viewArr(__int64 a[], int n)
     44 {
     45     for(int i = 0; i < n; i++)
     46         cout << a[i] << endl;
     47     return ;
     48 }
     49 
     50 int countNum(__int64 n)
     51 {
     52     __int64 *p;
     53     p = lower_bound(res, res+ cnt, n);
     54     return p - res;
     55 }
     56 
     57 int main(void)
     58 {
     59     //freopen("in.txt", "r", stdin);
     60     cnt = 0;
     61     dfs(0);
     62     //viewArr(res, 10);
     63     __int64 n;
     64     while(scanf("%I64d", &n) == 1)
     65     {
     66         printf("%d\n", countNum(n));
     67     }
     68     return 0;
     69 }
     70 
     71 
     72 /*
     73 *Time: 0ms
     74 *还是不怎么理解这种做法
     75 */
     76 #include <stdio.h>
     77 #include <math.h>
     78 #include <string.h>
     79 char s[15];
     80 /*
     81 传入数组下标i和,从当前位置开始剩余的数组长度。
     82 */
     83 int solve(int i,int p)
     84 {
     85     if(p==1)
     86         return s[i]>'2'?3:s[i]-'0'+1;
     87     /*当前值大于3,当然就可以取遍0-3的数字,这样子排列组合出的数值也一定比它小*/
     88     if (s[i]>'3')
     89         return (int)pow(4.0,p-1)*3;
     90     else
     91     {
     92         /*如果s[i] = 2,则取0-1时,后面的数字可以取遍0-3,除个位为3*/
     93         int tem1 = (int)(pow(4.0,p-2)*3*(s[i]-'0'));
     94         /*s[i]取2时,后面的数值就又是一次迭代计算啦*/
     95         int tem2 = solve(i+1,p-1);
     96         return tem1+tem2;
     97     }
     98 }
     99 
    100 int main()
    101 {
    102     int len;
    103     __int64 n;
    104     while (scanf("%I64d",&n)!=EOF)
    105     {
    106         n--;/*排列组合最大的数字就是n-1啦*/
    107         sprintf(s,"%I64d",n);
    108         len = strlen(s);
    109         printf("%d\n",solve(0,len));
    110     }
    111     return 0;
    112 }
  • 相关阅读:
    UNIX网络编程——处理服务器中大量的TIME_WAIT
    UNIX网络编程——套接字选项(心跳检测、绑定地址复用)
    UNIX网络编程——TCP 滑动窗口协议
    [Training Video
    [Training Video
    [Training Video
    [Training Video
    [Training Video
    Use formatter to format your JAVA code
    右键菜单没有新建文本文件了,怎么办?
  • 原文地址:https://www.cnblogs.com/cchun/p/2606369.html
Copyright © 2011-2022 走看看