数字を楽しんでいます
番号123456789はない複製と、1~9から正確番号からなる9桁の番号であることに注意してください。我々は唯一の異なる順列で、1から9までの数字を正確に成る別の9桁の数字であることを起こる246913578を、取得することを倍増。我々は再びそれを倍増場合、結果を確認するためにチェックしてください!
今、あなたは、このプロパティを使用してより多くの番号があるかどうかを確認すると仮定されています。それはで与えられた数を2倍、ある k個の数字、あなたは結果の数が元の数の桁だけ順列で構成されている場合は教えています。
入力仕様:
各入力には、一つのテストケースが含まれています。各ケースは、せいぜい20桁一つの正の整数を含んでいます。
出力仕様:
入力の数を2倍にするだけ元の数の桁の置換、または「いいえ」でない場合から成る数を与える場合は、各テストケースのために、最初の行に「はい」で印刷します。その後、次の行に、二重番号を印刷します。
サンプル入力:
1234567899
サンプル出力:
Yes
2469135798
タイトルは最大ビット数は20ビットであり、さらには最大long long型ケースが爆発するので、採用する分析によって理解列で処理すること。
コードの場合:
する#include <stdio.hに> する#include < 文字列・H> INTメイン(ボイド){ チャー NUM1 [ 21れている ]、NUM2 [ 21である]; scanfの(" %のS " 、NUM1); CHAR DoubleNum [ 21である]; CHAR TMP。 strcpyの(NUM2、NUM1); INT LEN = STRLEN(NUM2); // 各番号2によっては、アレイNUM2に格納されているINT carrybit = 0 ; //は各オペランドにビットを記憶チャーmidch; //文字列キープロセス のための(int型 I = LEN
。1 ; I> = 1 ; i-- ){
//アルゴリズム行う計算欄に記載された手順に従って midch = NUM2 [I]; NUM2 [I] =((NUM2 [I] - ' 0 ')* 2 +をcarrybit)%10 + ' 0 ' ; // 2によって最初に加え、最後の操作のキャリー発生 carrybitを =((midch- ' 0 ')* 2 + carrybit)/ 10 ; //このときにキャリーを計算しないように注意次いでNUM2 [i]は、NUM2 [I]がエラー変更されたため:carrybit =((NUM2 [I] - '0')+ carrybit * 2)/ 10
}
Num2を[ 0 ] =(NUM2 [ 0 ] - ' 0 ')* 2 + carrybit + ' 0 ' ; //最高レベル運ぶために持っていない最上位ビットが9より大きい場合、次の処理を説明する
IF(NUM2 [ 0 ]> ' 9は、' 乗算器と、元の2桁数が一致しない場合){//は、それは直接決定されていない のprintf(" なし\ N- " ); のprintf(" %D%D "、(NUM2 [ 0 ] - ' 0 ')/ 10(NUM2 [ 0 ] - ' 0 ')%10)。 printf( +" %S "、&NUM2 [ 1 ])。 } 他{ strcpyの(doublenum、NUM2)。
//冒泡排序NUM1 num2の ための(INT iは= 0 ; I <len- 1 ; I ++ ){ ため(INT J = 0 ; J <LEN-I- 1、J ++ ) 場合(NUM2 [J]> NUM2 [j個の+ 1 ]){ TMP = NUM2 [J]。 NUM2 [J] = NUM2 [J + 1 ]。 NUM2 [J 1 ] = TMP。 } } のために(INT iが= 0 ; iが<len- 1 ; I ++ ){ ため(INT J = 0 ; J <LEN-I- 1、J ++ ) 場合(NUM1 [J]> NUM1 [J + 1 ]){ TMP = NUM1 [J]。 NUM1 [J] = NUM1 [J + 1 ]。 NUM1 [J + 1 ] = TMP。 } }
もし(のstrcmp(NUM1、NUM2)== 0){ printf(" はい\ N " ); printf(" %sの" 、doublenum)。 } 他{ のprintf(" いいえ\ n " ); printf(" %sの" 、doublenum)。 } } 戻り 0 。 }
トピック出典:
https://pintia.cn/problem-sets/17/problems/263