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
【来源】
————————————————————————————————
这个是今天早上才看题目的题,这个星期实在是太颓废了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