kotonoha_pcg@ぷろこんにっき

ここ(http://kotonoha-pcg.hatenablog.com/)の別館です、競プロの話が殆どです。最近mdモードに変えて一気に使い勝手が変わりました。

CF #299 Div2 B

CodeForces #299 Div2 B Tavas and SaDDas

概要

 ラッキーナンバーnが与えられる(1≤n≤10^9).ラッキーナンバーnは,10進数の4と7のみを含む正の整数による.例えば,47,744,4はラッキーナンバーであるが,5,17,467は,ラッキーナンバーでは無い.

入力

 1行目にラッキーナンバーnが与えられる.

出力

 1からnまでの全ての(ラッキーナンバー内の)数をカウントして,一行で出力する.

解法

 入力された数値を一旦文字列化して,その上で4または7またはその双方が含まれているかどうかを判定する.…というのは考え付いた.たしかRubyでは文字列の数値(整数型)から文字型への変換ができたような気がする...気がするだけですが.他にも色々解法はあったようでした.

#include<bits/stdc++.h>
using namespace std;

int main(void){
	char n[10];
	//1,000,000,000
	scanf("%s",&n);
	int leng = strlen(n);
	
	int cn=0;
	for(int i=0;i<leng;i++){
		cn = cn<<1;
		if(n[i]=='7') cn++;
		cn++;
	}
	cout<<cn<<endl;
}

ソースは他の提出者のソースをほぼ写しました.

感想

 とりあえず,理屈は分かったのに書けないのが辛かった.4と7だけのケースを書いて,4と7を含む場合のソースは適当に書こうと思ってましたが,やっぱり無理でした.