无闻无问 发表于 2018-7-17 21:29

一个特别适合新手练习的C语言算法题

本帖最后由 无闻无问 于 2019-1-10 13:21 编辑

    今天,被邻居一个二年级小朋友的题给难倒了……看到题目,瞬间感觉读了N多年的书白费了:'(weeqw……同时,诅咒谁出了这种恐怖的、变态的题:wwqwq……简直是折磨人啊……我都怀疑当年是怎么毕业的……
    来吧,来吧,看看这个题,二年级的哟……看看现在的小学生学的什么!:lol
    附加题:请将1-9这9个数分别填入算式□□□□×□=□□□□中,使等式成立。1-9每个数在算式中只能出现一次且必须用一次。

https://static.52pojie.cn/static/image/hrline/1.gif
    怎么样,大脑飞转起来了吗????是不是感觉大脑不够用???
    我也是……想了半天,只能无语{:1_925:}……
    哎………………
    怎么办?思虑了好久,但总得解决,不然,不好交待呢?:(eew
    突然之间,想到了用电脑算。恰巧,这段时间在学习c语言。何不用c解决一下?一来化解了尴尬,二来也练练c语言……
    这确实是一个不错的c语言算法练习题!!!
    于是,开始动起手来,搞了一个多小时,终于得到了答案……真是不容易啊{:1_927:}……
    现将代码奉上,大家相互学习。因本人新学c,难免算法不够完美,欢迎各位大神大牛指正、建议……在此,万分感谢{:1_893:}{:1_893:}。
    测试环境:win10+vc2015。
https://static.52pojie.cn/static/image/hrline/1.gif
#include "stdafx.h"
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
    int ok=1;//满足条件标志
    int x0=0,x1=0,x2=0,x3=0,x4=1,sum=0;
    for(x0=1;x0<=9;x0++)
      for(x1=1;x1<=9;x1++)
          for(x2=1;x2<=9;x2++)
            for(x3=1;x3<=9;x3++)
                   for(x4=1;x4<=9;x4++){
                     ok=1;//归位标志
                     sum=(x0*1000+x1*100+x2*10+x3)*x4;
                     if(sum<9876){
                           int num={0,0};//用于保存算式□□□□×□=□□□□每一位的数。
                           num=x0;
                           num=x1;
                           num=x2;
                           num=x3;
                           num=x4;
                           num=sum/1000;//取积的千位
                           num=sum%1000/100;//取积的百位
                           num=sum%1000%100/10;//取积的十位
                           num=sum%10;//取积的个位
                           int i,j;
                           for(i=0;i<=8;i++){//循环遍历检查是否满足条件,即8位中有无相等的数或有无含0的情况。
                               for(j=i+1;j<=8;j++)
                               {
                                 if(num==num||num==0||num==0)
                                 {
                                    ok=0;
                                    break;//如果有相等,退出内层余下循环。
                                 }
                               }
                               if(ok==0) break;//退出外层余下循环。
                               }
                           if(ok==1) printf("%d%d%d%d×%d=%d\n",x0,x1,x2,x3,x4,sum);
                     }
                }
getchar();
return 0;
}

https://static.52pojie.cn/static/image/hrline/1.gif
运行结果:



https://static.52pojie.cn/static/image/hrline/2.gif
https://static.52pojie.cn/static/image/hrline/2.gif
2019年1月10日更新方法2:
#include "stdafx.h"
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
    int isRepeatNumeric(int i,int j);//函数声明
    //循环查找是否满足条件,m被乖数,n为乘数
    for(int m=1234;m<=9876;m++)
      for(int n=1;n<=9;n++)
          {
            if( m*n>9999 || isRepeatNumeric(m,n))//是否满足条件
            continue;
            else
            printf_s("%d*%d=%d\n",m,n,m*n);//打印满足条件的算式
          }
    getchar();
    return 0;
}
int isRepeatNumeric(int i,int j)//判断算式是否满足条件,即每位没有重复的数字。返回0表示满足条件……
{
    int total=i*j;
    int value={i%10,i/10%10,i/100%10,i/1000%10,
                  j,
                  total%10,total/10%10,total/100%10,total/1000%10};//将算式各位分解放入数组中
    //---------------------循环方式判断数组中是否有重复的数字
    for(int a=0;a<=7;a++)
      for(int b=a+1;b<=8;b++)
            if(value==value || value==0 || value==0)
            return 1;
    //----------------------------------------
    return 0;
}

    不知是否还有更完美的算法,还请大家不吝赐教,共同学习,谢谢!!!

快乐王子 发表于 2019-8-7 17:13

来个易语言的:
开始运行被调试程序
* 1738 | 4 | 6952
* 1963 | 4 | 7852
被调试易程序运行完毕



.版本 2
.支持库 spec

.程序集 窗口程序集_启动窗口

.子程序 __启动窗口_创建完毕
.局部变量 e, 整数型
.局部变量 f, 整数型
.局部变量 g, 整数型
.局部变量 h, 整数型
.局部变量 i, 整数型
.局部变量 a, 整数型
.局部变量 b, 整数型
.局部变量 c, 整数型
.局部变量 d, 整数型
.局部变量 x, 整数型
.局部变量 y, 整数型

.计次循环首 (9, a)
    .计次循环首 (9, b)
      .计次循环首 (9, c)
            .计次循环首 (9, d)
                .计次循环首 (9, e)
                  .计次循环首 (9, f)
                        .计次循环首 (9, g)
                            .计次循环首 (9, h)
                              .计次循环首 (9, i)
                                    .如果真 (a ≠ b 且 a ≠ c 且 a ≠ d 且 a ≠ e 且 a ≠ f 且 a ≠ g 且 a ≠ h 且 a ≠ i 且 b ≠ c 且 b ≠ d 且 b ≠ e 且 b ≠ f 且 b ≠ g 且 b ≠ h 且 b ≠ i 且 c ≠ d 且 c ≠ e 且 c ≠ f 且 c ≠ g 且 c ≠ h 且 c ≠ i 且 d ≠ e 且 d ≠ f 且 d ≠ g 且 d ≠ h 且 d ≠ i 且 e ≠ f 且 e ≠ g 且 e ≠ h 且 e ≠ i 且 f ≠ g 且 f ≠ h 且 f ≠ i 且 g ≠ h 且 g ≠ i 且 h ≠ i)
                                        x = 1000 × b + 100 × c + 10 × d + e
                                        y = 1000 × f + 100 × g + 10 × h + i
                                        .如果真 (x × a = y)
                                          调试输出 (x, a, y)
                                        .如果真结束

                                    .如果真结束

                              .计次循环尾 ()
                            .计次循环尾 ()
                        .计次循环尾 ()
                  .计次循环尾 ()
                .计次循环尾 ()
            .计次循环尾 ()
      .计次循环尾 ()
    .计次循环尾 ()
.计次循环尾 ()

RickoNoNo3 发表于 2019-7-23 15:36

何不DFS?

C++写了一点,C语言可以直接参考,递归回溯暴力DFS秒出
当然应该还可以剪枝,不过数据规模不太大暂时就这么写了。。

#include <iostream>
#include <sstream>
using namespace std;
int num, book;
void dfs(int k){
      if(k == 10){
                int a, b, c;
                stringstream ss;
                ss << num << num << num << num << " "
                   << num << " "
                   << num << num << num << num;
                ss >> a >> b >> c;
                if(a * b == c)
                        cout << a << "*" << b << "=" << c << endl;
                return;
      }
      for(int i = 1; i <= 9; i++){
                if(!book){
                        book = 1;
                        num = i;
                        dfs(k + 1);
                        book = 0;
                }
      }
}
int main(){
      dfs(1);
      return 0;
}

结果:
1738*4=6952
1963*4=7852


无闻无问 发表于 2018-7-17 21:35


复制粘贴的代码,怎么,这一句 if(num==num||num==0||num==0)中数据丢了?好奇怪……

luanshils 发表于 2018-7-17 21:41

c菜鸟看了代码表示可怕,打扰了

zhangbaida 发表于 2018-7-17 21:52

厉害,厉害,膜拜了

开心糖 发表于 2018-7-17 21:53

支持支持

ghtyrfd1 发表于 2018-7-17 22:10

你这个代码也太乱了,{}作用域分清楚啊,要不,不好理解

lunaaero 发表于 2018-7-17 22:30

比较复杂,可以研究

天才柯基 发表于 2018-7-17 22:33

本帖最后由 天才柯基 于 2018-7-17 22:47 编辑

。。。。。。。。。。。。

Anakin 发表于 2018-7-17 23:07

学习语言就是从C语言开始的对他蛮有感情的谢谢

pk8900 发表于 2018-7-17 23:37

本帖最后由 pk8900 于 2018-7-18 00:02 编辑

写了一个C++的,参考一下,不是最效率,但代码比较少一点
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
string rightstr = "123456789";
bool checkok(int n1, int n2)
{
      if (n1*n2 > 9876|| n1*n2<6789) return false;
      string str1 = to_string(n1);
      str1 = str1 + to_string(n2);
      str1 = str1 + to_string(n1*n2);
      sort(str1.begin(), str1.end());
      if (str1 == rightstr) return true;
      return false;
}
int main()
{
      for (int x = 1234; x <= 4987; x++)
                for (int y = 2; y <9; y++)
                        if (checkok(x, y))
                              cout << "found:" << x << "*" << y << "=" << x*y << endl;
system("pause");
return 0;
}
页: [1] 2 3 4 5 6
查看完整版本: 一个特别适合新手练习的C语言算法题