我试图在prolog中编写这个公式:
"str“是输入数字,因为字符串" base”是输入数字的基。
结果是,
(碱基)^0* strlen-1 +(碱)^1* strlen-2 +(碱)^2* strlen-3 +.
我对prolog很陌生,我现在有这样的想法:
calc([],_,0):- !.
calc([H|T],Base,Res):-
length([H|T],Long),
Long >= 0,
Size is Long - 1,
power(Base , Size, Res),
Res1 is Res * H,
calc(T,Base,Res1).但是它不能正常工作,我昨天花了很多时间试图解决这个问题,但没有成功。
任何帮助都很感激:)。
发布于 2021-05-02 14:24:44
你可以这样做:
value(String, Base, Value) :-
string_chars(String, Digits),
value(Digits, Base, 0, Value).
value([], _, Value, Value).
value([Digit|Digits], Base, Accumulator, Value) :-
atoi(Digit, Number),
NewAccumulator is Base*Accumulator + Number,
value(Digits, Base, NewAccumulator, Value).
atoi(Char, Int) :- % convert ASCII code to integer
char_code(Char, Code) ,
Int is Code - 48.预定义谓词string_chars将字符串转换为字符列表:
?- string_chars("1101", Chars).
Chars = ['1', '1', '0', '1'].谓词atoi将表示数字的字符转换为相应的整数:
?- atoi('3', Integer).
Integer = 3.假设[1,1,0,1]是整数列表(表示基2中的一个数字),则其在基10中的相应值可以计算如下:
Digit Accumulator
- 0
1 2 x 0 + 1 = 1
1 2 x 1 + 1 = 3
0 2 x 3 + 0 = 6
1 2 x 6 + 1 = 13下面是一些示例:
?- value("1101", 2, V).
V = 13.
?- value("1201", 3, V).
V = 46.Alternative S溶液假设您已经有了表示数字数字的整数列表,则解决方案甚至更简单:
value_integers(Digits, Base, Value) :-
value_integers(Digits, Base, 0, Value).
value_integers([], _, Value, Value).
value_integers([Digit|Digits], Base, Accumulator, Value) :-
NewAccumulator is Base*Accumulator + Digit,
value_integers(Digits, Base, NewAccumulator, Value).下面是一些示例:
?- value_integers([1,1,0,1], 2, Value).
Value = 13.
?- value_integers([1,2,0,1], 3, Value).
Value = 46.
?- value_integers([1,2,0,1], 10, Value).
Value = 1201.https://stackoverflow.com/questions/67355280
复制相似问题