回 帖 发 新 帖 刷新版面

主题:手动求对数

内容:


输入一个大整数n然后利用循环搜索k,使得3 k < =n <= 3 k+1

输出整数k 

输入说明:


一行一个整数n
输出说明:


一行一个整数

 

输入样例:
若题目没有特别说明,则应该以多组测试数据方式读取,或者参考a001。21
输出样例 :

2

回复列表 (共2个回复)

沙发

这个。。。那个,3K,,,,〈=N〈=3K+1,那K就是n除以3到n除已3+1了吗,搜索什么?

如果lz愿意,程序跟上!
var
        n,k,i:integer;
        f:boolean;
begin
        f:=false;
        read(n);
        for i:=1 to n div 3 do {K最多只会在N DIV 3之内}
                if (i*3>=n) and (n<=i*3+1) then begin write(i);f:=true; end;{用I代替K(写起来方便^.^)且在输出后做出标记}
        if not(f) then write('No found.');没找到}
end.

板凳

应该是3^k<=N<3^(k+1)吧(两边不能同时有等号,不然有些N对应两个答案)
建议交表,换句话说,先通过高精度或手动计算出3^1, 3^2……
然后将它们做成字符串数组
对输入的数字首先比较位数,然后依次比较大小即可。
如果不希望交表,那么再临时计算3^m也可以。
此时m的选择:trunc((N的位数-1)*ln(10)/ln(3))到这个数+4
计算3^m的时候注意要用高精度。

我来回复

您尚未登录,请登录后再回复。点此登录或注册