高精度进位制转换,Poj(1220)

转自ACdream。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXSIZE 60000

char in[MAXSIZE];
int oldbase,newbase;
int a[MAXSIZE],b[MAXSIZE],r[MAXSIZE];

int getNum(char c)
{
    if(c >= ‘0‘ && c <= ‘9‘) return c - ‘0‘;
    if(c >= ‘A‘ && c<= ‘Z‘ ) return c - ‘A‘ + 10;
    return c - ‘a‘ + 36;
}

char getChar(int i)
{
    if(i >= 0 && i <= 9) return i + ‘0‘;
    if(i >= 10 && i <= 35) return i - 10 + ‘A‘;
    return i - 36 + ‘a‘;
}

void chToNum()
{
    a[0] = strlen(in);
    for(int i=1;i<=a[0];i++)
    {
        a[i] = getNum(in[i-1]);
    }
}

void alter()
{
    while(a[0] >= 1)
    {
        int i,t = 0;
        for(i=1;i<=a[0];i++)
        {
            t = t * oldbase + a[i];
            b[ ++b[0] ] = t / newbase;
            t %= newbase;
        }
        r[ ++r[0] ] = t;
        b[0] = a[0];
        for(i = 1; i <= b[0] && !b[i]; i++) ;
        for(a[0] = 0; i <= b[0]; i++) a[ ++a[0] ] = b[i];
        memset(b,0,sizeof(b));
    }
}

void print()
{
    printf("%d %s\n%d ",oldbase,in,newbase);
    while(r[0]>=1)
    {
        printf("%c",getChar(r[ r[0]-- ]));
    }
    printf("\n\n");
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        while(n--)
        {
            scanf("%d %d %s",&oldbase,&newbase,in);
            chToNum();
            alter();
            print();
        }
    }
    return 0;
}
时间: 2024-12-06 06:32:09

高精度进位制转换,Poj(1220)的相关文章

poj1220:高精度进制转换模板题

今天撸3708  一直奇怪的re 就先放下了,写这个题的过程中学习了一个高精度进制转换,用这个模板写了1220 记录一下: #include <iostream> #include <stdio.h> #include<string.h> #include<algorithm> #include<string> #include<ctype.h> using namespace std; #define MAXN 10000 char

高精度进制转换

高精度进制转换: 对于普通的不是很大的数的相互转换,我们一般采用不断模取余的方法,例如:将10进制数m转换成n进制数,则对m模n取余即可.但是,如果是一个有几百.几千或者更多位的大数呢?显然这种模取余的方法不再适用了.那如何求解此类大数的转换呢?接下来,介绍一种通用方法. 我们将一个大数的每一位看做是一个单独的数,但是却不是完全孤立的,与其它位置上的数有关联,从该数的最高位开始,对该位上的数除以要转换的进制基数,得到商和余数,商取代原来该位上的数,进行下一位的相同操作,但是注意下一位的除数不仅仅

各种进位制转换

在数字后面加上不同的字母来表示不同的进位制.B(Binary)表示二进制,O(Octal)表示八进制,D(Decimal)或不加表示十进制,H(Hexadecimal)表示十六进制. 例如:(101011)B=(53)O=(43)D=(2B)H 二进制 → 十进制 方法:二进制数从低位到高位(即从右往左)计算,第0位的权值是2的0次方,第1位的权值是2的1次方,第2位的权值是2的2次方,依次递增下去,把最后的结果相加的值就是十进制的值了. 例:将二进制的(101011)B转换为十进制的步骤如下:

java高精度进制转换

POJ1131   由于本题只有小数部分(整数部分均为0),故在进制转换的之后只能自己手写转换方法了.   8进制转换10进制的方法为,以0.75为例,应是7*8^-1 + 5*8^-2.所以呢,可以直接定位到小数点后一位,采用此方法进行计算. 1 import java.util.*; 2 import java.math.*; 3 4 public class Main 5 { 6 public static void main(String []args) 7 { 8 Scanner ci

POJ 1220 NUMBER BASE CONVERSION 高精度进制转换

      poj  50题拍照合影留念 NUMBER BASE CONVERSION Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4620   Accepted: 2115 Description Write a program to convert numbers in one base to numbers in a second base. There are 62 different digits: { 0-

POJ 1220 高精度/进制转换

n进制转m进制,虽然知道短除法但是还是不太理解,看了代码理解一些了: 记住这个就好了: for(int k=0;l; ){ for(int i=l ; i>=1 ; i--){ num[i - 1] += num[i] % m * n; num [i] / =m; } num[k++]=num[0] % m; num[0] /= m; while( l > 0&& num[ l - 1]==0) l--; } AC代码如下: #include<cstdio> #in

数学推导+高精度进制转换+解同余方程 POJ 3708

题意:点击打开链接 把m,k表示成d进制,对于这个递归函数,每一次递归都是一次每一位数字的置换,求出每一位的循环节,最终f(m)=k就是要每一位都相等,即解同余方程组. 代码: #include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #include <cmath> #include<climits> #include <algorith

poj3708:函数式化简+高精度进制转换+同余方程组

题目大意 给定一个函数 找出满足条件   等于 k 的最小的x m,k,d已知 其中 m,k 很大需要使用高精度存储 思路: 对 函数f(m)进行化简 ,令t=ceil( log(d,m) ) 可以得到 f(m)=d ^ t * ( a [ m / (d^t) ] ) + d ^ (t-1) * ( b[ m/( d^(t-1) ) ] )......+b [m%d] : 我们一看,每一项都是 跟 d 的次方有关,所以考虑使用 d 进制进行计算 设     m=a1b1b2b3b4(d进制) 那

高精度的进制转换

1 #include <stdio.h> 2 #include <string.h> 3 4 char str[1000];//输入字符串 5 int start[1000],ans[1000],res[1000]; //被除数,商,余数 6 //res[]存的是余数,其最后结果的逆序为所求的结果 7 //转换前后的进制 8 const int oldBase = 10; 9 const int newBase = 2; 10 11 void change() 12 { 13 //