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>
#include<algorithm>
#include<cstring>
#include<map>
#include<iostream>
using namespace std;
const int maxn=1200;
map<char,int> no;
map<int,char> output;
int num[maxn],num1[maxn];
char s[maxn];
int main(){
	for(int i=‘0‘,j=0;i<=‘9‘;i++,j++)
		no[i]=j,output[j]=i;
	for(int i=‘A‘,j=10;i<=‘Z‘;i++,j++)
		no[i]=j,output[j]=i;
	for(int i=‘a‘,j=36;i<=‘z‘;i++,j++){
		no[i]=j,output[j]=i;
	}
	int n,m,k,t;
	cin>>t;
	while(t--){
		cin>>n>>m;
		scanf("%s",s);
		int l=strlen(s);
		for(int i=0;i<l;i++){
			num[l-i-1]=no[s[i]];
		}
		for(k=0;l;){
			for(int i=l;i>=1;i--){
				num[i-1]+=num[i]%m*n;
				num[i]/=m;
			}
			num1[k++]=num[0]%m;
			num[0]/=m;
			while(l>0&&num[l-1]==0)l--;
		}
		printf("%d ",n);
		printf("%s\n",s);
		printf("%d ",m);
		for(int i=k-1;i>=0;i--)
			printf("%c",output[num1[i]]);
		cout<<"\n"<<endl;
	}

}

  

原文地址:https://www.cnblogs.com/pkgunboat/p/9315236.html

时间: 2024-08-16 00:16:15

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

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 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 //

poj 2635 千进制

转自:http://www.cnblogs.com/kuangbin/archive/2012/04/01/2429463.html 大致题意: 给定一个大数K,K是两个大素数的乘积的值. 再给定一个int内的数L 问这两个大素数中最小的一个是否小于L,如果小于则输出这个素数. 解题思路: 首先对题目的插图表示无语... 高精度求模+同余模定理 1.  Char格式读入K.把K转成千进制Kt,同时变为int型. 把数字往大进制转换能够加快运算效率.若用十进制则耗费很多时间,会TLE. 千进制的性

PHP进制转换[实现2、8、16、36、64进制至10进制相互转换]

自己写了一个PHP进制转换程序,一个类吧,第一次写这个东东,写这个东东,在处理文本文件时能用得到. 可以实现: 10进制转换2.8.16.36.62进制2.8.16.36.62进制转换10进制 有点要注意下,2.8.16进制转换时,使用的是系统的自己的函数. 所以,不管怎么高精度转换值可能大于2147483646. 另外, 32进制低精转换,最大值:2147483646: 32进制高精转换,最大值:77309411327: 64进制高精转换,最大值:133143986175. jinzhi.ph