free pascal 任意进制转10进制

详解加分,题目要正确,最好独一无二,谢谢.
题目是这样的:
------------------------------------------------------------
Description

K进制转10进制

Input

第一行一个K进制数,第二行一个数K

Output

输出十进制数

Sample Input

11110100001000111111
2

Sample Output

999999
---------------------------------------------------------
要主程序,谢谢,会加分的.

//这是我自己原创的方法,独一无二,可支持100000000位或更多位的 任意 进制间转换!
//任意进制间可以直接转换,不需通过十进制的间接转换!
//支持2到35进制间的任意进制转换!
//本程序严格试验通过!
//本程序原理:n进制→m进制,用除以m取余数倒读数法,不过不能直接计算,因为计算机会将n进制的数当做十进制的数去计算,所以我们要模拟整除,见代码的GetRemainder过程关键语句
//由于十进制数进行除法时是将当前数字整除m的余数乘以10再加上后面的数作为下次计算的被除数
//例如: 65÷16=?
// _0__4____________________
// 16) 6 5
// _0_______________________ 第一次计算6整除16,因为6÷16=0*16+6,所以余6
// 65 将6乘以10加上剩下的数5
// ____64___________________ 第二次计算65整除16,因为65÷16=4*16+1,所以余1
// 1 最终最后的余数1就是65整除16的余数
//同理,n进制转m进制时可将当前数字整除m的余数乘以n再加上后面的数作为下次计算的被除数
//例如: (65)8进制→16进制 即n=8,m=16
//(65)8进制÷16=?
// _0__3____________________
// 16) 6 5
// _0_______________________ 第一次计算6整除16,因为6÷16=0*16+6,所以余6
// 53 将6乘以8加上剩下的数5
// ____48___________________ 第二次计算53整除16,因为53÷16=3*16+5,所以余5
// 5 最终最后的余数5就是65整除16的余数
//第一次整除余数为5,由于整除的得数为3不为0,所以还要继续取余数
//(3)8进制÷16=?
// _0_______________________
// 16) 3
// _0_______________________ 第一次计算3整除16,因为3÷16=0*16+3,所以余3
// 3 最终最后的余数3就是3整除16的余数
//这时整除余数为0,由于整除的得数为0,所以不要继续取余数
//倒读余数为35,所以(63)8进制→(35)16进制
var
i,j,k,len,m,n:longint;
c:char;
s:ansistring;//无限字符串,用于读入高进度的数
a,b:array [0..100000000] of byte;//a储存当前的被除数,b储存每次除以m的余数
function ChrToVal(c:char):byte;
begin
if (c>='0')and(c<='9') then
exit(ord(c)-48)
else
exit(ord(upcase(c))-55);
end;
procedure GetRemainder;
begin
//计算出整除后的得数,并用得数更新被除数
{**************************************}
for j:=len downto 2 do {*}
begin {*}
inc(a[j-1],(a[j] mod m)*n); {*}
a[j]:=a[j] div m; {*}
end; {*}
{**************************************}
//计算出余数,并储存起来
inc(k);
b[k]:=a[1] mod m;
a[1]:=a[1] div m;
//更新被除数长度
while a[len]=0 do
dec(len);
end;
begin
readln(s);//输入要转换的数字串
readln(n);//输入原本的进制
readln(m);//输入要转换为的进制,如果只要转十进制可改为 m:=10;
len:=length(s);//获取被除数长度
//将每一位都转换为数存入数组
for i:=1 to len do
a[len-i+1]:=ChrToVal(s[i]);//将字符转换为数字
k:=0;//初始化答案长度为0
a[0]:=1;//初始化进制转换完成标记
//使用除以m取余数倒读数的方法进行进制转换
while len<>0 do//看被除数是否还有
GetRemainder;//除以m取余数
//倒着输出余数,即为结果
for i:=k downto 1 do
if b[i]>9 then
write(chr(b[i]+55))
else
write(b[i]);
end.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-25
var s:string; //记录长度
n,k,t,i:longint;
begin
readln(n);
str(n,s);
readln(k);
t:=1;
tot:=0; //转换后的数值
for i:=1 to length(s) do
begin
inc(tot,ord(s[i])-48); //一个个加上去,这会用吧=tot:=tot+ord(s[i])-48
t:=t*k;
end;
writeln(tot); //输出
end.
{直接打的,自己没编译}
第2个回答  2011-01-31
var
a:ansistring;
i,k,l,t,o:longint;
s:int64;
begin
readln(a,k);
l:=length(a);
t:=1; //k^0=1
for i:=l downto 1 do
begin
o:=ord(a[i]);
if (o<ord('0'))or(o>ord('9')) then o:=o-ord('A')+10 //不在0~9(>10进制的情况)
else o:=o-ord('0'); //是数字
inc(s,o*t); //按位乘权
t:=t*2;
end;
writeln(s);
end.
第3个回答  2011-01-25
那你总要给出是几进制的哇。。。
假设是n进制的
那就是转换成字符串后最后一位*1+倒数第二位*n+倒数第三位*n*n+……
类推累加下去

要程序请另加分。。。。。
第4个回答  2011-01-25
..起码给出几进制啊!
如果8进制和10进制程序好像没法判断
第5个回答  2011-01-26
我会十进制转换任意进制:
var
n,m:int64;
i,j:longint;
a:array[0..1000] of longint;
begin
readln(n);
readln(m);
j:=0;
while n>0 do
begin
inc(j);
a[j]:=n mod m;
n:=n div m
end;
a[0]:=j;
for i:=a[0] downto 1 do
write(a[i]);
writeln;

end.