這也是一個數學題,剛開始還真以為好難的樣子,需要用到什么數論的理論啊。其實,只要去找規律就行了。
題意是給出一個進制,一個數字的最低位,和另外的一個數字,比如10進制,第一個數字的最低位是7,第二個數字是4,
根據這些信息,和規則(XXXXX7 * 4 = 7XXXXX,例子
: 179487 * 4 = 717948 )求出第一個數字的最小長度。這個
規則的意思是乘積是把第一個數字的最低位移動到最高位上去就行了。
貌似很難的樣子,其實用筆在紙上求一下XXXXX7 * 4 = 7XXXXX就會發現。XXXXX7的每一位都是能夠確定的,當然
順序是從最低位到最高位開始。因為知道最低位,所以次低位一定是最低位*第二個數%base。以此類推,遞歸下去即可。
最終條件是,沒有進位了,而且乘積+原來的進位==最低位。
我用的遞歸完全可以改成循環的形式,這樣速度應該會快些。
代碼如下:
#include <stdio.h>
int nBase;
int nTwo;
int nOneLow;
int GetMin(int nLow, int nCarry, int nNum)
{
//printf("nLow:%d, nCarry:%d, nNum:%d\n", nLow, nCarry, nNum);
int nTemp = nCarry + nLow * nTwo;
if (nTemp == nOneLow)
{
return nNum;
}
return GetMin(nTemp % nBase, nTemp / nBase, nNum + 1);
}
int main()
{
//freopen("out.txt", "w", stdout);
while (scanf("%d%d%d", &nBase, &nOneLow, &nTwo) == 3)
{
printf("%d\n", GetMin(nOneLow, 0, 0) + 1);
}
return 0;
}