鱼C论坛

 找回密码
 立即注册
查看: 2116|回复: 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

  1. #include<stdio.h>
  2. int main()
  3. {   
  4.     int h,i,l,m,k,n,p=0,count=0;
  5.     double num[100000];
  6.     double num_[100000];
  7.     int repeat[5];
  8.     double div;
  9.     for(i=0;i<100000;i++)
  10.     {
  11.         num[i]=i;
  12.         /*把0到99999的所有数存入数组*/
  13.     }
  14.     for(i=0;i<100000;i++)
  15.     {
  16.             for(h=0;h<5;h++,num[i]/10)
  17.             {
  18.                     repeat[h]=(int)num[i]%10;
  19.                     /*repeat[h]存放每一位数字*/
  20.             }
  21.                 for(l=0;l<5;l++)
  22.                 {
  23.                         for(m=0;m<5;m++)
  24.                         {
  25.                                 if(repeat[l]==repeat[m])
  26.                                 {
  27.                                         count=1;
  28.                                 }
  29.                         }
  30.                 }
  31.                         /*如果有重复数字,count不为0*/
  32.                         if(count==0)
  33.                         {
  34.                                 num_[p]=num[i];
  35.                                 p++;
  36.                         }
  37.                         count=0;
  38.                 }
  39.         }
  40.     scanf("%d",&n);
  41.     for(i=0;i<100000;i++)
  42.     {
  43.         for(k=0;k<100000;k++)
  44.             {   
  45.                 div=num[i]*1.0/num[k];
  46.                 if(div==n)
  47.                     printf("%05.0f/%05.0f=%d\n",num[i],num[k],n);
  48.             }
  49.     }
  50.     return 0;
  51. }
复制代码


这是我的代码,报错信息:(表示自己看不懂)
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分钟是不让过的


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

  2. int check(int a , int b)
  3. {
  4.         int d[10] = {0} , e[10] = {0} , i , k , r                            ;
  5.         if(a < 100000) for(k = a , i = 0 ; k ; k /= 10 , i ++) e[i] = k % 10 ;
  6.         if(b < 100000) for(k = b , i = 5 ; k ; k /= 10 , i ++) e[i] = k % 10 ;
  7.         for(i = 0 ; i < 10 ; i ++) d[e[i]] ++                                ;
  8.         for(r = 1 , i = 0 ; i < 10 ; i ++) {
  9.                 if(! d[i]) {
  10.                         r --                                                 ;
  11.                         break                                                ;
  12.                 }
  13.         }
  14.         return r                                                             ;
  15. }

  16. main(void)
  17. {
  18.         int i , m , n                                                        ;
  19.         scanf("%d" , & n)                                                    ;
  20.         for(m = 0 , i = 1234 ; i * n < 98766 ; i ++) {
  21.                 if(check(i , i * n)) {
  22.                         m  ++                                                ;
  23.                         printf("%d / %d = %d\n" , i * n , i , n)             ;
  24.                 }
  25.         }
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  2. int check1(int n)
  3. {
  4.         int d[5] = {0} , i , j , m , r                   ;
  5.         for(m = 0 ; n ; n /= 10 , m ++) d[m] = n % 10    ;
  6.         for(r = 1 , i = 0 ; i < m - 1 && r ; i ++) {
  7.                 for(j = i + 1 ; j < m ; j ++) {
  8.                         if(d[i] == d[j]) {
  9.                                 r --                     ;
  10.                                 break                    ;
  11.                         }
  12.                 }               
  13.         }
  14.         return r                                         ;
  15. }

  16. int check2(int a , int b)
  17. {
  18.         int d[5] = {0} , e[5] = {0} , i , j  , m , n , r ;
  19.         for(m = 0 ; a ; a /= 10 , m ++) d[m] = a % 10    ;
  20.         for(n = 0 ; b ; b /= 10 , n ++) e[n] = b % 10    ;
  21.         r = 0                                            ;
  22.         if(m + n > 8) {
  23.                 for(r = 1 , i = 0 ; i < m && r ; i ++) {
  24.                         for(j = 0 ; j < n ; j ++) {
  25.                                 if(e[j] == d[i]) {
  26.                                         r --             ;
  27.                                         break            ;
  28.                                 }
  29.                         }
  30.                 }
  31.         }        
  32.         return r                                         ;
  33. }

  34. main(void)
  35. {
  36.         int i , j , m , n                                                                ;
  37.         scanf("%d" , & m)                                                                ;
  38.         for(n = 0 , i = 1000 ; i < 100000 ; i ++) {
  39.                 if(check1(i)) {
  40.                         for(j = 1000 ; j < 100000 ; j ++) {
  41.                                 if(check1(j) && check2(i , j)) {
  42.                                         if(i % j == 0 && i / j == m) {
  43.                                                 printf("%d / %d = %d\n" , i , j , i / j) ;
  44.                                                 n ++                                     ;
  45.                                         }
  46.                                 }
  47.                         }
  48.                 }        
  49.         }
  50. }
复制代码

        编译、运行实况:
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. 12
  4. 45792 / 3816
  5. 50376 / 4198
  6. 71208 / 5934
  7. 73128 / 6094
  8. 73548 / 6129
  9. 81504 / 6792
  10. 86304 / 7192
  11. 86340 / 7195
  12. 89532 / 7461
  13. 91032 / 7586
  14. 91584 / 7632
  15. 97620 / 8135

  16. D:\00.Excise\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

为什么在dev上运行你的代码,输入数字后什么反应都没有
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

        会有结果的,需要一点时间和耐心,等等看。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  2. int check1(int n)
  3. {
  4.         int d[5] = {0} , i , j , m , r                   ;
  5.         for(i = 0 ; n ; n /= 10 , i ++) d[i] = n % 10    ;
  6.         for(r = 1 , i = 0 ; i < 4 && r ; i ++) {
  7.                 for(j = i + 1 ; j < 5 ; j ++) {
  8.                         if(d[i] == d[j]) {
  9.                                 r --                     ;
  10.                                 break                    ;
  11.                         }
  12.                 }               
  13.         }
  14.         return r                                         ;
  15. }

  16. int check2(int a , int b)
  17. {
  18.         int d[5] = {0} , e[5] = {0} , i , j  , r         ;
  19.         for(i = 0 ; a ; a /= 10 , i ++) d[i] = a % 10    ;
  20.         for(i = 0 ; b ; b /= 10 , i ++) e[i] = b % 10    ;
  21.         for(r = 1 , i = 0 ; i < 5 && r ; i ++) {
  22.                 for(j = 0 ; j < 5 ; j ++) {
  23.                         if(e[j] == d[i]) {
  24.                                 r --                     ;
  25.                                 break                    ;
  26.                         }
  27.                 }
  28.         }        
  29.         return r                                         ;
  30. }

  31. main(void)
  32. {
  33.         int i , j , m , n                                                                ;
  34.         scanf("%d" , & m)                                                                ;
  35.         for(n = 0 , i = 1000 ; i < 100000 ; i ++) {
  36.                 if(check1(i)) {
  37.                         for(j = 1000 ; j < 100000 ; j ++) {
  38.                                 if(check1(j) && check2(i , j)) {
  39.                                         if(i % j == 0 && i / j == m) {
  40.                                                 printf("%d / %d = %d\n" , i , j , i / j) ;
  41.                                                 n ++                                     ;
  42.                                         }
  43.                                 }
  44.                         }
  45.                 }        
  46.         }
  47. }
复制代码

        编译、运行实况:
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. 12
  4. 45792 / 3816 = 12
  5. 73548 / 6129 = 12
  6. 89532 / 7461 = 12
  7. 91584 / 7632 = 12

  8. D:\00.Excise\C>x
  9. 3
  10. 17469 / 5823 = 3
  11. 17496 / 5832 = 3
  12. 50382 / 16794 = 3
  13. 53082 / 17694 = 3
  14. 61749 / 20583 = 3
  15. 69174 / 23058 = 3
  16. 91746 / 30582 = 3
  17. 96174 / 32058 = 3

  18. D:\00.Excise\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不行啊,输入12后,等了1分钟以上还是什么结果也没有
小甲鱼最新课程 -> https://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 的时候,看看是否符合条件,这也可以从侧面佐证这个代码是正确可行的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思,提交到平台上必须在20s以内运行完毕,3分钟是不让过的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

  2. int check(int a , int b)
  3. {
  4.         int d[10] = {0} , e[10] = {0} , i , k , r                            ;
  5.         if(a < 100000) for(k = a , i = 0 ; k ; k /= 10 , i ++) e[i] = k % 10 ;
  6.         if(b < 100000) for(k = b , i = 5 ; k ; k /= 10 , i ++) e[i] = k % 10 ;
  7.         for(i = 0 ; i < 10 ; i ++) d[e[i]] ++                                ;
  8.         for(r = 1 , i = 0 ; i < 10 ; i ++) {
  9.                 if(! d[i]) {
  10.                         r --                                                 ;
  11.                         break                                                ;
  12.                 }
  13.         }
  14.         return r                                                             ;
  15. }

  16. main(void)
  17. {
  18.         int i , m , n                                                        ;
  19.         scanf("%d" , & n)                                                    ;
  20.         for(m = 0 , i = 1234 ; i * n < 98766 ; i ++) {
  21.                 if(check(i , i * n)) {
  22.                         m  ++                                                ;
  23.                         printf("%d / %d = %d\n" , i * n , i , n)             ;
  24.                 }
  25.         }
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

      楼主,测试 9 楼的代码,0 等待。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


能麻烦你再加一下注释吗,感谢,对那一层再编辑一下即可
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

大神,注释拜托
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-9 10:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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