1. 程式人生 > >ACM程式設計選修課——1031: Hungar的得分問題(二)(楊輝三角+二進位制轉換)

ACM程式設計選修課——1031: Hungar的得分問題(二)(楊輝三角+二進位制轉換)

1031: Hungar的得分問題(二)

時間限制: 1 Sec  記憶體限制: 64 MB
提交: 15  解決: 10
[提交][狀態][討論版]

題目描述

距離正式選秀時間越來越近了,今天Hungar打算組織一場比賽!

於是他和其他4名隊員組成了一支隊伍,比賽就此開始,然而計分器似乎出了點問題,Hungar驚奇得發現,當第一次得分時,計分器顯示的是4,第二次是7,第三次是44.....

Hungar馬上發現,這些顯示的數字只包含4和7,他突然想知道,給定一個這樣的數字,它的排名是多少?

輸入

第一行一個整數T(T <=100), 代表有T組資料.

對於每一組資料,包含一個整數n(1 <= n <= 10^9).

輸出

n的排名.

樣例輸入

34777

樣例輸出

126

提示

輸入資料保證合法(即n只包含4和7)

排名從小到大開始排.

例如排在第1的是4,排在第2的是7......

為數不多的仔細思考想出的題,剛開始只知道算可以求前面幾次的次數sum(N:1~s.size-1,列在紙上可以構成楊輝三角),但是到n以為是個next_permutation,然後打表看了下資料比較大的情況下早過萬了,用next估計超時,然後想半天找到了4和7出現的相對位置與本次序數關係——首先將4與7化為2進位制的0與1,然後轉換為十進位制,再加上前面的sum,即可得到答案。似乎遞推順序並非按字典序...與next的順序只有幾組符合答案,糾結半天想碰碰運氣結果AC了
程式碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<set>
#include<map>
#include<sstream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
int poww(int n)
{
	int sum=1;
	for (int i=1; i<=n; i++)
		sum*=2;
	return sum;
}
int bi_to_dec(string s)//
{
	int sum=0;
	for (int i=0; i<(int)s.size(); i++)
	{
		sum=sum*2+s[i]-'0';
	}
	return sum;
}
void change(string &s)//轉換為2進位制
{
	for (int i=0; i<(int)s.size(); i++)
	{
		if(s[i]=='7')
			s[i]='1';
		else if(s[i]=='4')
			s[i]='0';		
	}
}
int main (void)
{
	string s;
	int t;
	cin>>t;
	getchar();
	while (t--)
	{
		getline(cin,s);
		int len=(int)s.size();
		int ans=poww(len)-1;//計算前n-1組的sum
		change(s);
		ans=ans+bi_to_dec(s);//加上本次的序數
		cout<<ans<<endl;
	}	
	return 0;
}