uva 550 - Multiplying by Rotation
這也是一個(gè)數(shù)學(xué)題,剛開(kāi)始還真以為好難的樣子,需要用到什么數(shù)論的理論啊。其實(shí),只要去找規(guī)律就行了。題意是給出一個(gè)進(jìn)制,一個(gè)數(shù)字的最低位,和另外的一個(gè)數(shù)字,比如10進(jìn)制,第一個(gè)數(shù)字的最低位是7,第二個(gè)數(shù)字是4,
根據(jù)這些信息,和規(guī)則(XXXXX7 * 4 = 7XXXXX,例子: 179487 * 4 = 717948 )求出第一個(gè)數(shù)字的最小長(zhǎng)度。這個(gè)
規(guī)則的意思是乘積是把第一個(gè)數(shù)字的最低位移動(dòng)到最高位上去就行了。
貌似很難的樣子,其實(shí)用筆在紙上求一下XXXXX7 * 4 = 7XXXXX就會(huì)發(fā)現(xiàn)。XXXXX7的每一位都是能夠確定的,當(dāng)然
順序是從最低位到最高位開(kāi)始。因?yàn)橹雷畹臀唬源蔚臀灰欢ㄊ亲畹臀?第二個(gè)數(shù)%base。以此類推,遞歸下去即可。
最終條件是,沒(méi)有進(jìn)位了,而且乘積+原來(lái)的進(jìn)位==最低位。
我用的遞歸完全可以改成循環(huán)的形式,這樣速度應(yīng)該會(huì)快些。
代碼如下:
#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;
}
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;
}
posted on 2012-05-08 16:24 yx 閱讀(1460) 評(píng)論(0) 編輯 收藏 引用 所屬分類: 數(shù)學(xué)題

