您的位置:首页 > 其它

HDU2541_Simple Addition Expression

2012-07-24 13:49 323 查看
/*
*Time: 93ms
*题目大意:
*        求i+(i+1)+(i+2)的结果对于有没有进位,没有进位的称为Simple Addition Expression
*        给定一个n,求i < n有多少个数可以称为simple Addition Expression.
*解题思路:
*        总共有786432个符合要求的数据。所以可以用暴力。
*        求出所有的满足的simple Addition Expression的数。之后用二分查找位置即可。
*/


View Code

#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;

const int MAX = 1000000;
int num[10], cnt;
__int64 res[MAX];

__int64 arrayToInt64(int arr[], int n)
{
__int64 digit = 1, sum = 0;
for(int i = n; i >= 0; i--)
{
sum += arr[i] * digit;
digit *= 10;
}
return sum;
}

void dfs(int digit)
{
if(digit != 9)
{
for(int i = 0; i < 4; i++)
{
num[digit] = i;
dfs(digit + 1);
}
}
else
{
for(int i = 0; i < 3; i++)
{
num[digit] = i;
res[cnt++] = arrayToInt64(num, digit);
}
}

return ;
}

void viewArr(__int64 a[], int n)
{
for(int i = 0; i < n; i++)
cout << a[i] << endl;
return ;
}

int countNum(__int64 n)
{
__int64 *p;
p = lower_bound(res, res+ cnt, n);
return p - res;
}

int main(void)
{
//freopen("in.txt", "r", stdin);
cnt = 0;
dfs(0);
//viewArr(res, 10);
__int64 n;
while(scanf("%I64d", &n) == 1)
{
printf("%d\n", countNum(n));
}
return 0;
}

/*
*Time: 0ms
*还是不怎么理解这种做法
*/
#include <stdio.h>
#include <math.h>
#include <string.h>
char s[15];
/*
传入数组下标i和,从当前位置开始剩余的数组长度。
*/
int solve(int i,int p)
{
if(p==1)
return s[i]>'2'?3:s[i]-'0'+1;
/*当前值大于3,当然就可以取遍0-3的数字,这样子排列组合出的数值也一定比它小*/
if (s[i]>'3')
return (int)pow(4.0,p-1)*3;
else
{
/*如果s[i] = 2,则取0-1时,后面的数字可以取遍0-3,除个位为3*/
int tem1 = (int)(pow(4.0,p-2)*3*(s[i]-'0'));
/*s[i]取2时,后面的数值就又是一次迭代计算啦*/
int tem2 = solve(i+1,p-1);
return tem1+tem2;
}
}

int main()
{
int len;
__int64 n;
while (scanf("%I64d",&n)!=EOF)
{
n--;/*排列组合最大的数字就是n-1啦*/
sprintf(s,"%I64d",n);
len = strlen(s);
printf("%d\n",solve(0,len));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: