鱼C论坛

 找回密码
 立即注册
查看: 1858|回复: 11

[已解决]输出abcde/fghij=x表达式

[复制链接]
发表于 2020-11-14 18:49:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Danmoits 于 2020-11-15 08:27 编辑

任务描述
本关任务:输入正整数x(2≤x≤79),输出所有形如abcde/fghij=x的表达式,其中i-j由不同的数字0~9组成。

编程要求
在右侧编辑器补充代码,输入x后输出形如abcde/fghij=x的表达式。

测试输入:32;
预期输出:75168/02349=32

测试输入:12;
预期输出:
45792/03816=12
73548/06129=12
89532/07461=12
91584/07632=12
#include<stdio.h>
int main()
{   
    int h,i,l,m,k,n,p=0,count=0;
    double num[100000];
    double num_[100000];
    int repeat[5];
    double div;
    for(i=0;i<100000;i++)
    {
        num[i]=i;
        /*把0到99999的所有数存入数组*/
    }
    for(i=0;i<100000;i++)
    {
            for(h=0;h<5;h++,num[i]/10)
            {
                    repeat[h]=(int)num[i]%10;
                    /*repeat[h]存放每一位数字*/ 
            }
                for(l=0;l<5;l++)
                {
                        for(m=0;m<5;m++)
                        {
                                if(repeat[l]==repeat[m])
                                {
                                        count=1;
                                }
                        }
                } 
                        /*如果有重复数字,count不为0*/
                        if(count==0)
                        {
                                num_[p]=num[i];
                                p++;
                        }
                        count=0;
                }
        }
    scanf("%d",&n);
    for(i=0;i<100000;i++)
    {
        for(k=0;k<100000;k++)
            {   
                div=num[i]*1.0/num[k];
                if(div==n)
                    printf("%05.0f/%05.0f=%d\n",num[i],num[k],n); 
            }
    }
    return 0;
}

这是我的代码,报错信息:(表示自己看不懂)
src/step10/step10_main.c:40:11: error: expected declaration specifiers or ‘…’ before string constant
scanf(“%d”,&n);
^~
src/step10/step10_main.c:40:16: error: expected declaration specifiers or ‘…’ before ‘&’ token
scanf(“%d”,&n);
^
src/step10/step10_main.c:41:5: error: expected identifier or ‘(’ before ‘for’
for(i=0;i<100000;i++)
^
src/step10/step10_main.c:41:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘<’ token
for(i=0;i<100000;i++)
^
src/step10/step10_main.c:41:23: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘++’ token
for(i=0;i<100000;i++)
^~
src/step10/step10_main.c:50:5: error: expected identifier or ‘(’ before ‘return’
return 0;
^~
src/step10/step10_main.c:51:1: error: expected identifier or ‘(’ before ‘}’ token
}
^

可以修改我的代码,也可以提供新的代码。(运行时间在20s以内)
最佳答案
2020-11-15 11:31:47
本帖最后由 jackz007 于 2020-11-15 13:12 编辑
Danmoits 发表于 2020-11-15 08:27
不好意思,提交到平台上必须在20s以内运行完毕,3分钟是不让过的


        即时完成的版本来了
#include <stdio.h>

int check(int a , int b)
{
        int d[10] = {0} , e[10] = {0} , i , k , r                            ;
        if(a < 100000) for(k = a , i = 0 ; k ; k /= 10 , i ++) e[i] = k % 10 ;
        if(b < 100000) for(k = b , i = 5 ; k ; k /= 10 , i ++) e[i] = k % 10 ;
        for(i = 0 ; i < 10 ; i ++) d[e[i]] ++                                ;
        for(r = 1 , i = 0 ; i < 10 ; i ++) {
                if(! d[i]) {
                        r --                                                 ;
                        break                                                ;
                }
        }
        return r                                                             ;
}

main(void)
{
        int i , m , n                                                        ;
        scanf("%d" , & n)                                                    ;
        for(m = 0 , i = 1234 ; i * n < 98766 ; i ++) {
                if(check(i , i * n)) {
                        m  ++                                                ;
                        printf("%d / %d = %d\n" , i * n , i , n)             ;
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-14 20:53:04 | 显示全部楼层
#include <stdio.h>

int check1(int n)
{
        int d[5] = {0} , i , j , m , r                   ;
        for(m = 0 ; n ; n /= 10 , m ++) d[m] = n % 10    ;
        for(r = 1 , i = 0 ; i < m - 1 && r ; i ++) {
                for(j = i + 1 ; j < m ; j ++) {
                        if(d[i] == d[j]) {
                                r --                     ;
                                break                    ;
                        }
                }                
        }
        return r                                         ;
}

int check2(int a , int b)
{
        int d[5] = {0} , e[5] = {0} , i , j  , m , n , r ;
        for(m = 0 ; a ; a /= 10 , m ++) d[m] = a % 10    ;
        for(n = 0 ; b ; b /= 10 , n ++) e[n] = b % 10    ;
        r = 0                                            ;
        if(m + n > 8) {
                for(r = 1 , i = 0 ; i < m && r ; i ++) {
                        for(j = 0 ; j < n ; j ++) {
                                if(e[j] == d[i]) {
                                        r --             ;
                                        break            ;
                                }
                        }
                }
        }        
        return r                                         ;
}

main(void)
{
        int i , j , m , n                                                                ;
        scanf("%d" , & m)                                                                ;
        for(n = 0 , i = 1000 ; i < 100000 ; i ++) {
                if(check1(i)) {
                        for(j = 1000 ; j < 100000 ; j ++) {
                                if(check1(j) && check2(i , j)) {
                                        if(i % j == 0 && i / j == m) {
                                                printf("%d / %d = %d\n" , i , j , i / j) ;
                                                n ++                                     ;
                                        }
                                }
                        }
                }        
        }
}
        编译、运行实况:
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
12
45792 / 3816
50376 / 4198
71208 / 5934
73128 / 6094
73548 / 6129
81504 / 6792
86304 / 7192
86340 / 7195
89532 / 7461
91032 / 7586
91584 / 7632
97620 / 8135

D:\00.Excise\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-14 20:58:34 | 显示全部楼层
jackz007 发表于 2020-11-14 20:53
编译、运行实况:

为什么在dev上运行你的代码,输入数字后什么反应都没有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-14 21:04:43 | 显示全部楼层
Danmoits 发表于 2020-11-14 20:58
为什么在dev上运行你的代码,输入数字后什么反应都没有

        会有结果的,需要一点时间和耐心,等等看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-14 21:29:08 | 显示全部楼层
本帖最后由 jackz007 于 2020-11-14 21:43 编辑

       结果有问题,没有考虑 4 位数时的前导 0,下面是修改过的代码与编译、运行结果
#include <stdio.h>

int check1(int n)
{
        int d[5] = {0} , i , j , m , r                   ;
        for(i = 0 ; n ; n /= 10 , i ++) d[i] = n % 10    ;
        for(r = 1 , i = 0 ; i < 4 && r ; i ++) {
                for(j = i + 1 ; j < 5 ; j ++) {
                        if(d[i] == d[j]) {
                                r --                     ;
                                break                    ;
                        }
                }                
        }
        return r                                         ;
}

int check2(int a , int b)
{
        int d[5] = {0} , e[5] = {0} , i , j  , r         ;
        for(i = 0 ; a ; a /= 10 , i ++) d[i] = a % 10    ;
        for(i = 0 ; b ; b /= 10 , i ++) e[i] = b % 10    ;
        for(r = 1 , i = 0 ; i < 5 && r ; i ++) {
                for(j = 0 ; j < 5 ; j ++) {
                        if(e[j] == d[i]) {
                                r --                     ;
                                break                    ;
                        }
                }
        }        
        return r                                         ;
}

main(void)
{
        int i , j , m , n                                                                ;
        scanf("%d" , & m)                                                                ;
        for(n = 0 , i = 1000 ; i < 100000 ; i ++) {
                if(check1(i)) {
                        for(j = 1000 ; j < 100000 ; j ++) {
                                if(check1(j) && check2(i , j)) {
                                        if(i % j == 0 && i / j == m) {
                                                printf("%d / %d = %d\n" , i , j , i / j) ;
                                                n ++                                     ;
                                        }
                                }
                        }
                }        
        }
}
        编译、运行实况:
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
12
45792 / 3816 = 12
73548 / 6129 = 12
89532 / 7461 = 12
91584 / 7632 = 12

D:\00.Excise\C>x
3
17469 / 5823 = 3
17496 / 5832 = 3
50382 / 16794 = 3
53082 / 17694 = 3
61749 / 20583 = 3
69174 / 23058 = 3
91746 / 30582 = 3
96174 / 32058 = 3

D:\00.Excise\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-14 23:04:50 | 显示全部楼层
jackz007 发表于 2020-11-14 21:04
会有结果的,需要一点时间和耐心,等等看。

不行啊,输入12后,等了1分钟以上还是什么结果也没有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-14 23:08:22 | 显示全部楼层
本帖最后由 jackz007 于 2020-11-14 23:11 编辑
Danmoits 发表于 2020-11-14 23:04
不行啊,输入12后,等了1分钟以上还是什么结果也没有


       等 3 分钟左右看看呢,我用的电脑可是 10 年前的笔记本。你可以验证一下我得到的结果,特别是输入 3 的时候,看看是否符合条件,这也可以从侧面佐证这个代码是正确可行的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-15 08:27:37 | 显示全部楼层
jackz007 发表于 2020-11-14 23:08
等 3 分钟左右看看呢,我用的电脑可是 10 年前的笔记本。你可以验证一下我得到的结果,特别是输 ...

不好意思,提交到平台上必须在20s以内运行完毕,3分钟是不让过的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-15 11:31:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-11-15 13:12 编辑
Danmoits 发表于 2020-11-15 08:27
不好意思,提交到平台上必须在20s以内运行完毕,3分钟是不让过的


        即时完成的版本来了
#include <stdio.h>

int check(int a , int b)
{
        int d[10] = {0} , e[10] = {0} , i , k , r                            ;
        if(a < 100000) for(k = a , i = 0 ; k ; k /= 10 , i ++) e[i] = k % 10 ;
        if(b < 100000) for(k = b , i = 5 ; k ; k /= 10 , i ++) e[i] = k % 10 ;
        for(i = 0 ; i < 10 ; i ++) d[e[i]] ++                                ;
        for(r = 1 , i = 0 ; i < 10 ; i ++) {
                if(! d[i]) {
                        r --                                                 ;
                        break                                                ;
                }
        }
        return r                                                             ;
}

main(void)
{
        int i , m , n                                                        ;
        scanf("%d" , & n)                                                    ;
        for(m = 0 , i = 1234 ; i * n < 98766 ; i ++) {
                if(check(i , i * n)) {
                        m  ++                                                ;
                        printf("%d / %d = %d\n" , i * n , i , n)             ;
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-15 13:14:30 | 显示全部楼层
Danmoits 发表于 2020-11-15 08:27
不好意思,提交到平台上必须在20s以内运行完毕,3分钟是不让过的

      楼主,测试 9 楼的代码,0 等待。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-15 15:14:40 | 显示全部楼层
本帖最后由 Danmoits 于 2020-11-15 15:18 编辑
jackz007 发表于 2020-11-15 13:14
楼主,测试 9 楼的代码,0 等待。


能麻烦你再加一下注释吗,感谢,对那一层再编辑一下即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-15 19:56:30 | 显示全部楼层
jackz007 发表于 2020-11-15 11:31
即时完成的版本来了

大神,注释拜托
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 13:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表