カメヲラボ

主にプログラミングとお勉強全般について書いてます

Cabric Number Problem(0)

  • 为什么OLE?

Discussの一番上が笑える。
というのは良いとして、この問題では4桁の整数が与えられる。
各桁の数を昇順・降順でソートし、その差を計算し、再びソート、差を計算・・・
ということを繰り返すとかならず0か6174になる。
その手順を出力するという問題だ。

例えば、5364という入力なら、


N=5364:
6543-3456=3087
8730-378=8352
8532-2358=6174
Ok!! 3 times
のように出力する。

ただし、計算の途中でゾロ目(1111や4444等)が出てきた場合は"No!!"と出力しなければならない。どうせテストケースは0000〜9999のすべてだろうなと思いすべての入力に対して、Noとなる入力を調べてみたところ、入力値自体がゾロ目の場合しかないみたいだ。

サブタイトル「为什么OLE」の为什么はweishenme(ウェイシェンモ)OLE?、なんでOLE?という意味。チャイニーズコーダーと仲良くなるためにも、中国語を勉強しましょう、みなさん。

そう、OLE(Output Limit Exceed)なのですよ。
0000〜9999まですべてがテストケースに含まれていた場合の出力は894154B。間違ってるとは思わんのだけどナァ、む〜ん。もうちょっと考えてわからなかったら、誰かにメールを送ってみよう。。。

一応ちゃちゃっと書いたコードを晒しておこう。

#include<string.h>
char s[5],t[5];
q(char*a,char*b){return*b-*a;}
main(n,x,y,c,f){
	for(;x=gets(s),y=*s-'-';){
		printf("N=%d:\n",n=atoi(s));
		for(c=0;f=y-x!=0&&y-x!=6174;++c){
			if(n%1111==0)break;
			qsort(s,4,1,strcmp);x=atoi(s);
			qsort(s,4,1,q);y=atoi(s);
			printf("%d-%d=%d\n",y,x,y-x);
			sprintf(s,"%4d\n",n=y-x);
		}
		printf(f?"No!!\n":"Ok!! %d times\n",c);
	}

}