「AOJ再挑戦51~55」の編集履歴(バックアップ)一覧に戻る

AOJ再挑戦51~55 - (2014/01/29 (水) 22:38:23) の編集履歴(バックアップ)


問51 Differential II

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0051
数字の文字列を並べ変えて最大の数と最小の数を作った時その差を計算する問題。
解法
並べ替えて手前と後ろから数字に直すだけです。

#include<stdio.h>
#include<algorithm>

int main(){
	int n;
	char text[9];
	scanf("%d",&n);
 	while(n--){
		int max=0,min=0;
		scanf("%s",text);
		std::sort(text,text+8);
		for(int i=0;i<8;i++) min=min*10+text[i]-'0';
 		for(int i=7;i>=0;i--)max=max*10+text[i]-'0';
		printf("%d\n",max-min);
	}
}




問52 Factorial II

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0052
20億!とかの末尾の0の数をこたえる問題。

解法
10^nの素因数は2と5で5の数で5のほうが少ないです。
5,5^2、5^3、、、が何個できるかを集計すれば答えが出ます。

#include<stdio.h>
#include<iostream>

int main(){
	long long int n;
 	while(std::cin>>n){
		if(n==0)break;
		long long int ans=0,fivePow=5,n1=n;
		while(n1>=fivePow){
 			ans+=n1/fivePow;
			fivePow*=5;
		}
 		std::cout<<ans<<"\n";
	}
}