一个自然数的七进制表达式是一个三位数,而这个数的九进制表示一个三位数,且这两个三位数的数码顺序正好相反,求这个三位数。
int *is_trans(int trans);
void main()
{
int number[3],i,j,k,m,trans,*p,y;
for (i = 1;i < 7;i++)
{
for (j = 0;j < 7;j++)
{
for (k = 0;k < 7;k++)
{
number[0] = i;
number[1] = j;
number[2] = k;
trans = i * 49 + j * 7 + k;
p = is_trans(trans);
for (m = 0;m < 3;m++)
{
if (number[m] == p[m])
y = 1;
else
{
y = 0;
break;
}
}
if (y == 1)
{
printf("%d",trans);
break;
}
}
}
}
}
int *is_trans(int trans)
{
int b[3],q,i;
i = 2;
for (trans;trans != 0;)
{
q = trans % 9;
trans /= 9;
b[i] = q;
i--;
if (i < 0)
break;
}
return b;
}
可以帮忙分析一下,为什么这个不对呢??
没看懂你表达的意思????
能example个吗
最后结果没有的。
这种完全可以自行验证,你找到的值是不是要求的样子。
你可以拆分方法,用一个进制方法foo(num,n) 找到一个进制数,如果发现正好相返就输出。
伪代码
int m=67^2+67+6;
for(int i=0;i<=m;i++){
int a1=foo(i,7);//7进制
int a2=foo(i,9);//9进制
搞成字符串
if(a1str==a2str reverse){ //反转比较
找到
}
}
你的代码太烂七八糟,懒得看,我自己写了一个,你看看
def convert(num: int, notation: int) -> list:
l = []
while num >= notation:
mod = num % notation
l.insert(0, mod)
num = num // notation
l.insert(0, num)
l.reverse()
return l
def reverse_equal(l1:list, l2:list) -> bool:
l1.reverse()
l1_count = len(l1)
for i in range(l1_count):
if l1[i] != l2[i]:
return False
return True
def fuck() -> list:
l = []
for i in range(101, 325):
l7 = convert(i, 7)
l9 = convert(i, 9)
if reverse_equal(l7, l9):
l.append(i)
return l
if __name__ == "__main__":
l = fuck()
print(l)
为什么我限定在101到325之间,因为我提前算了,这个数只可能在这个范围里。其实这种问题,你设个断点调试就行了,不用问人的,如果输出太多,可以把日志写了文件里,然后打开文件看就好了。 另外,这个编辑器可以格式化代码的。
我略看了下,我觉得你的思路是对的,但是有两点可以改进,如果改进了,你就能很容易找到错误:
当你拆分出好几个小方法后,只要分别验证是哪个小方法有问题就好了,而验证小方法是否正确是非常简单的。这是单元测试的基础:1,职责单一;2,耦合性尽量低。
其实,代码是给人看的,不是给机器看的,好的代码应该是那种一眼就明白作者要干什么的代码(比如我写的Fuck方法,从名字上就可以看出作者的愤怒)。机器其实看汇编语言比看高级程序设计语言还方便呢。