算法笔记004——确定进制

  • Post author:
  • Post category:其他



http://ybt.ssoier.cn:8088/problem_show.php?pid=1413


随手粘题源好习惯~~~


【题目描述】


6*9=42对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6

(13)

* 9

(13)

= 42

(13)

, 而 42

(13)

=4*13

1

+2*13

0

=54

(10)



你的任务是写一段程序,读入三个整数p、q和 r,然后确定一个进制 B(2≤B≤40) 使得 p * q = r。 如果 B 有很多选择, 输出最小的一个。


例如:p=11, q=11, r=121.则有11

(3)

* 11

(3)

= 121

(3)

因为 11

(3)

= 1 * 3

1

+ 1 * 3

0

= 4

(10)

和121

(3)

=1*3

2

+2*3

1

+1*3

0

=16

(10)

。对于进制 10,同样有11

(10)

* 11

(10)

= 121

(10)

。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。


【输入】


一行,包含三个整数p、q、r。 p、q、r的所有位都是数字,并且1 ≤ p、q、r ≤ 1,000,000。


【输出】


一个整数:即使得p*q=r成立的最小的B。如果没有合适的B,则输出0。


【输入样例】

6 9 42


【输出样例】

13


【来源】




No


————————————————————————————————


这个是今天早上才看题目的题,这个星期实在是太颓废了233


同学描述的不是太清楚所以下午才找了题目,早上也就知道个大概


老师要求的是循环输入但是我提交一直是错误的,就先贴这个代码,交了过了的




下面是代码:




#include

<cstdio>


#include

<limits>


unsigned

int

jinzhi

(

int i

,

int num

)


{



int s

=

0

, m

=

1

;


while

(num

)


{

if

((num

%

10

)

>= i

)


return __INT_MAX__

;

s

+=

(num

%

10

)*m

;

m

*= i

;

num

/=

10

;


}


return s

;


}


int

main

()


{



int p

, q

, r

, i

;


scanf

(

“%d%d%d”

,&p

,

&q

,

&r

);


for

(i

=

2

; i

<=

40

; i

++)


{



if

(

jinzhi

(i

, p

)*

jinzhi

(i

, q

)

==

jinzhi

(i

, r

))


{



printf

(

“%d

\n



,i

);


return

0

;


}


}


printf

(

“0

\n



);


}































































































































































































































今天学习了新技能(点名感谢秦_殇同学)





























































































































































































































#include <limits>里边能调出最大值(虽然不知道怎么弄出来的233)





























































































































































































































用最大值是为了让后面主函数循环里的判断计算不成立





























































































































































































































其余的好像就没有什么比较复杂的地方了





























































































































































































































今天交了很多次还是过不去的原因是循环的上限开小了





























































































































































































































下次该细心读题的粗心小垃圾。。。





























































































































































































































————————————————————————————————





























































































































































































































撒花~~~





























































































































































































































确定进结束啦~~~





























































































































































































































————————————————————————————————————————





























































































































































































































补充:















































































































题目描述


6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13) * 9(13)= 42(13), 而 42(13) = 4 * 131 + 2 * 130 = 54(10)。 你的任务是写一段程序读入三个整数p、q和 r,然后确定一个进制 B(2<=B<=16) 使得 p * q = r. 如果 B有很多选择, 输出最小的一个。例如: p = 11, q = 11, r = 121. 则有 11(3) * 11(3) = 121(3) 因为 11(3) = 1 * 31 + 1 * 30 = 4(10) 和 121(3) = 1 * 32 + 2 * 31 + 1 * 30 = 16(10)。 对于进制 10,有 11(10) * 11(10)= 121(10)。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。


输入


输入有 T组测试样例。 T在第一行给出。每一组测试样例占一行,包含三个整数p、q、r。 p、q、r的所有位都是数字,并且1 <= p、q、r <= 1,000,000。


输出


对于每个测试样例输出一行。该行包含一个整数:即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。


样例输入

3
6 9 42
11 11 121
2 2 2


样例输出

13
3
0

下面是代码:

#include <cstdio>

#include <limits>

unsigned int jinzhi(int i, int num)

{


int s = 0, m = 1;

while(num)

{


if((num % 10) >= i)

return __INT_MAX__;

s += (num%10)*m;

m *= i;

num /= 10;

}

return s;

}

int main()

{


int n, p, q, r, i;

scanf(“%d”,&n);

while(n–)

{


scanf(“%d%d%d”,&p, &q, &r);

for(i = 2; i <= 16; i++)

{


if(jinzhi(i, p)*jinzhi(i, q) == jinzhi(i, r))

break;

}

if(i == 17)

printf(“0\n”);

else

printf(“%d\n”,i);

}

}


之前过不了是因为我的return 0 在程序中间的原因。。。

所以下次得仔细点看题目了。。。

一次输入数据就不会有什么区别但是多组输入就会有错误了。。。

————————————————————————————————

这次估计没什么问题了233

转载于:https://www.cnblogs.com/jun-ruo-sui-nian/p/suijun_004.html