首页 新闻 搜索 专区 学院

C语言的一个题目

0
悬赏园豆:10 [待解决问题]

一个自然数的七进制表达式是一个三位数,而这个数的九进制表示一个三位数,且这两个三位数的数码顺序正好相反,求这个三位数。

include<stdio.h>

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;

}

可以帮忙分析一下,为什么这个不对呢??

shmily涂的主页 shmily涂 | 初学一级 | 园豆:22
提问于:2019-11-14 22:40
< >
分享
所有回答(3)
0

没看懂你表达的意思????
能example个吗

wwr01 | 园豆:641 (小虾三级) | 2019-11-15 09:26

支持(0) 反对(0) shmily涂 | 园豆:22 (初学一级) | 2019-11-15 14:44

最后结果没有的。

支持(0) 反对(0) shmily涂 | 园豆:22 (初学一级) | 2019-11-15 14:44
0

这种完全可以自行验证,你找到的值是不是要求的样子。
你可以拆分方法,用一个进制方法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){ //反转比较
找到
}
}

gw2010 | 园豆:1399 (小虾三级) | 2019-11-15 10:15
1

你的代码太烂七八糟,懒得看,我自己写了一个,你看看

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. 一个方法里不要有太多的逻辑(一个方法应该只干一件事情),你的main方法里逻辑太多了,建议拆分出一个函数专门判断一个数的7进制和9进制是否符合要求
  2. 你遍历了所有3位的7进制数,其实可以预先算出一个范围来,这样效率会高些。

当你拆分出好几个小方法后,只要分别验证是哪个小方法有问题就好了,而验证小方法是否正确是非常简单的。这是单元测试的基础:1,职责单一;2,耦合性尽量低。

其实,代码是给人看的,不是给机器看的,好的代码应该是那种一眼就明白作者要干什么的代码(比如我写的Fuck方法,从名字上就可以看出作者的愤怒)。机器其实看汇编语言比看高级程序设计语言还方便呢。

会长 | 园豆:9565 (大侠五级) | 2019-11-15 10:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册