zoukankan      html  css  js  c++  java
  • 基数等比,确定进制

    问题描述

    6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13) * 9(13) = 42(13),而 42(13) = 4 * 131 + 2 * 130 = 54(10)。你的任务是写一段程序读入三个整数pq 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在第一行给出。每一组测试样例占一行,包含三个整数pqr pqr的所有位都是数字,并且1 £ pqr £ 1,000,000

    输出要求

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

    输入样例 

    3

    6 9 42

    11 11 121

    2 2 2

    输出样例 

    13

    3

    0

     

    1 #include<stdio.h>
    2 #include<string.h>
    3
    4 long b2ten(char*x,int b){
    5 int ret=0,i;
    6 int len=strlen(x);
    7 for(i=0;i<len;i++)
    8 {
    9 if(x[i]-'0'>=b) return-1;
    10 ret*=b;
    11 ret+=x[i]-'0';
    12 }
    13 return (long)ret;
    14 }
    15 void main()
    16 {
    17 int n;
    18 char p[8],q[8],r[8];
    19 long pA,qA,rA;
    20 int b=2;
    21 scanf("%d",&n);
    22 while(n--)
    23 {
    24 scanf("%s%s%s",p,q,r);
    25 for(b=2;b<=16;b++)
    26 {
    27 pA=b2ten(p,b);
    28 qA=b2ten(q,b);
    29 rA=b2ten(q,b);
    30 if(pA==-1||qA==-1||rA==-1) continue;
    31 if(pA*qA==rA)
    32 {
    33 printf("%d\n",b);
    34 break;
    35 }
    36 }
    37 if(b==17) printf("0\n");
    38 }
    39 }
  • 相关阅读:
    每天一个小算法(Heapsort)
    每天一个小算法(matlab armijo)
    每天一个小算法(Shell sort5)
    每天一个小算法(Shell Sort3)
    每天一个小算法(Shell Sort2)
    Java并发编程:阻塞队列
    Java并发编程:并发容器之CopyOnWriteArrayList
    Java并发编程:并发容器之ConcurrentHashMap
    Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
    豆瓣的前世今生
  • 原文地址:https://www.cnblogs.com/youxin/p/2053771.html
Copyright © 2011-2022 走看看