吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 16128|回复: 59
收起左侧

[C&C++ 转载] 一个特别适合新手练习的C语言算法题

  [复制链接]
无闻无问 发表于 2018-7-17 21:29
本帖最后由 无闻无问 于 2019-1-10 13:21 编辑

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


    怎么样,大脑飞转起来了吗????是不是感觉大脑不够用???
    我也是……想了半天,只能无语……
    哎………………
    怎么办?思虑了好久,但总得解决,不然,不好交待呢?
    突然之间,想到了用电脑算。恰巧,这段时间在学习c语言。何不用c解决一下?一来化解了尴尬,二来也练练c语言……
    这确实是一个不错的c语言算法练习题!!!
    于是,开始动起手来,搞了一个多小时,终于得到了答案……真是不容易啊……
    现将代码奉上,大家相互学习。因本人新学c,难免算法不够完美,欢迎各位大神大牛指正、建议……在此,万分感谢
    测试环境:win10+vc2015。

#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[9]={0,0};//用于保存算式□□□□×□=□□□□每一位的数。
                           num[0]=x0;
                           num[1]=x1;
                           num[2]=x2;
                           num[3]=x3;
                           num[4]=x4;
                           num[5]=sum/1000;//取积的千位
                           num[6]=sum%1000/100;//取积的百位
                           num[7]=sum%1000%100/10;//取积的十位
                           num[8]=sum%10;//取积的个位
                           int i,j;
                           for(i=0;i<=8;i++){//循环遍历检查是否满足条件,即8位中有无相等的数或有无含0的情况。
                               for(j=i+1;j<=8;j++)
                               {
                                   if(num==num[j]||num==0||num[j]==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;
}


运行结果:

捕获.PNG



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[9]={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[a]==value || value[a]==0 || value==0)
            return 1;
    //----------------------------------------
    return 0;
}
1011.png
    不知是否还有更完美的算法,还请大家不吝赐教,共同学习,谢谢!!!

免费评分

参与人数 6吾爱币 +5 热心值 +6 收起 理由
hanjia + 1 + 1 可怕,小白一点没懂
Slan + 1 + 1 我很赞同!
GetProcessId + 1 + 1 用心讨论,共获提升!
她在远方 + 1 用心讨论,共获提升!
lintao199 + 1 + 1 用心讨论,共获提升!
lunaaero + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

快乐王子 发表于 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秒出
当然应该还可以剪枝,不过数据规模不太大暂时就这么写了。。

[C++] 纯文本查看 复制代码
#include <iostream>
#include <sstream>
using namespace std;
int num[10], book[10];
void dfs(int k){
        if(k == 10){
                int a, b, c;
                stringstream ss;
                ss << num[1] << num[2] << num[3] << num[4] << " "
                   << num[5] << " "
                   << num[6] << num[7] << num[8] << num[9];
                ss >> a >> b >> c;
                if(a * b == c)
                        cout << a << "*" << b << "=" << c << endl;
                return;
        }
        for(int i = 1; i <= 9; i++){
                if(!book[i]){
                        book[i] = 1;
                        num[k] = i;
                        dfs(k + 1);
                        book[i] = 0;
                }
        }
}
int main(){
        dfs(1);
        return 0;
}


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


 楼主| 无闻无问 发表于 2018-7-17 21:35
225.png
复制粘贴的代码,怎么,这一句 if(num==num[j]||num==0||num[j]==0)中数据丢了?好奇怪……

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
luanshils + 3 + 1 用心讨论,共获提升!

查看全部评分

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 编辑

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

免费评分

参与人数 1吾爱币 -3 收起 理由
苏紫方璇 -3 请勿灌水,提高回帖质量是每位会员应尽的义务!

查看全部评分

Anakin 发表于 2018-7-17 23:07
学习语言就是从C语言开始的  对他蛮有感情的  谢谢
pk8900 发表于 2018-7-17 23:37
本帖最后由 pk8900 于 2018-7-18 00:02 编辑

写了一个C++的,参考一下,不是最效率,但代码比较少一点
[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热心值 +1 收起 理由
wushaominkk + 1 用心讨论,共获提升!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 23:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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