小学奥数与信奥

小学奥数与信奥

题目

3.
把4分拆成几个数相加的形式(0不考虑作为加数),有多少种不同的分拆方式?
把5分拆成几个数相加的形式(0不考虑作为加数),有多少种不同的分拆方式?
把6分拆成几个数相加的形式(0不考虑作为加数),有多少种不同的分拆方式?
把8分拆成几个数相加的形式(0不考虑作为加数),有多少种不同的分拆方式?
思考
穷举法即可 2019-8-26 16:55
程序输出如下
把4分拆成几个数相加的形式(0不考虑作为加数),有多少种不同的分拆方式?
4
4=1+1+1+1
4=1+1+2
4=1+3
4=2+2
cnt=4
把5分拆成几个数相加的形式(0不考虑作为加数),有多少种不同的分拆方式?
5
5=1+1+1+1+1
5=1+1+1+2
5=1+1+3
5=1+2+2
5=1+4
5=2+3
cnt=6
把6分拆成几个数相加的形式(0不考虑作为加数),有多少种不同的分拆方式?
6
6=1+1+1+1+1+1
6=1+1+1+1+2
6=1+1+1+3
6=1+1+2+2
6=1+1+4
6=1+2+3
6=1+5
6=2+2+2
6=2+4
6=3+3
cnt=10
把8分拆成几个数相加的形式(0不考虑作为加数),有多少种不同的分拆方式?
8
8=1+1+1+1+1+1+1+1
8=1+1+1+1+1+1+2
8=1+1+1+1+1+3
8=1+1+1+1+2+2
8=1+1+1+1+4
8=1+1+1+2+3
8=1+1+1+5
8=1+1+2+2+2
8=1+1+2+4
8=1+1+3+3
8=1+1+6
8=1+2+2+3
8=1+2+5
8=1+3+4
8=1+7
8=2+2+2+2
8=2+2+4
8=2+3+3
8=2+6
8=3+5
8=4+4
cnt=21
对比小学奥数该题答案的呈现形式,能明显感觉到,信奥的思路与小学奥数的思路还是有很大不同的.

以下为程序代码
#include <stdio.h>
int n,a[15],cnt=0;
void dfs(int step,int sum){
    int i,j;
    if(sum>n)return;//剪枝
    if(sum==n){
        cnt++;
        printf("%d=%d",n,a[1]);
        for(j=2;j<=step-1;j++)printf("+%d",a[j]);
        printf("\n");
    }
    for(i=a[step-1];i<n;i++){//此处错写成for(i=a[step-1]+1;i<n;i++){
        a[step]=i;
        dfs(step+1,sum+i);
    }
}
int main(){
    scanf("%d",&n);
    a[0]=1,dfs(1,0);//此处错写成a[0]=0,dfs(1,0);
    printf("cnt=%d\n",cnt);
    return 0;
}

题目

2.将1-9九个数平均分成3组,使每组的3个数相加的和相等,这样的分法有几种?
思考
为何只有2种,不会证明,那就穷举法 2019-8-26 16:19
程序输出如下

ans 1
1+5+9=15
2+6+7=15
3+4+8=15
ans 2
1+6+8=15
2+4+9=15
3+5+7=15
程序代码如下:

#include <stdio.h>
#include <string.h>
int a[15],ans=0,vis[15];
void dfs(int step){
    int i,j,b,c,d;
    if(step==9+1&&a[1]<a[2]&&a[2]<a[3]&&a[4]<a[5]&&a[5]<a[6]&&a[7]<a[8]&&a[8]<a[9]&&a[1]<a[4]&&a[4]<a[7]){
        b=a[1]+a[2]+a[3],c=a[4]+a[5]+a[6],d=a[7]+a[8]+a[9];
        if(b==c&&b==d){
            ans++,printf("ans %d\n",ans);
            printf("%d+%d+%d=%d\n",a[1],a[2],a[3],b);
            printf("%d+%d+%d=%d\n",a[4],a[5],a[6],b);
            printf("%d+%d+%d=%d\n",a[7],a[8],a[9],b);
        }
        return;
    }
    for(i=1;i<=9;i++)
        if(!vis[i]){
            vis[i]=1;
            a[step]=i;
            dfs(step+1);
            vis[i]=0;
        }
}
int main(){
    memset(vis,0,sizeof(vis));
    dfs(1);
    return 0;
}

题目

1.在1,2,3,4,5,6,7,8,9之间填上“+”或“-”(位置相邻的两个数或三个数可以看成一个数),使算式成立。

1 2 3 4 5 6 7 8 9

思考过程如下:

本人答案12+3-4+5+67+8+9=100

参考答案123-45-67+89=100

两者答案不同,激起了我的好奇心,究竟有多少种答案,每个答案表达式又是怎样。于是停下手头的学习,开始研究。发现问题,解决问题,比学习问题更重要。

1|2|3|4|5|6|7|8|9,之间有8个空隙,每个空隙可放“+”,“-”,或不放,3种情况。共有3^8=6561种情况,计算机1s以内轻松完成。

2个方案,要么写8个for循环,要么写个深搜,决定选择后者。

版本2

//准备采用3进制的方式开始处理此题
//3进制马上测试,3进制数据生成,成功.
//继续下一部分功能.
//有了深搜的经验,代码很快编好,输出11个等式,如下.
123-45-67+89=100
12-3-4+5-6+7+89=100
12+3+4+5-6-7+89=100
123+4-5+67-89=100
1+2+3-4+5+6+78+9=100
12+3-4+5+67+8+9=100
1+23-4+56+7+8+9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
123+45-67+8-9=100
123-4-5-6-7+8-9=100
//2019-2-18 16:42
#include <stdio.h>
#include <string.h>
int sign[15];//3进制 0无符号,1"+",2"-"
int main(){
    int i,j,sum,delta;
    memset(sign,0,sizeof(sign));
    while(sign[9]==0){
        sign[0]=1,sign[1]+=1,sum=0,delta=0;
        for(i=1;i<9;i++)sign[i+1]+=sign[i]/3,sign[i]%=3;
        for(i=1;i<9;i++){
             if(sign[i]==1||sign[i]==2){//i数字之后符号为"+"或"-"
                 if(sign[i-1]==1)sum+=i,delta=0;
                 else if(sign[i-1]==2)sum-=i,delta=0;
                 else if(sign[i-1]==0){
                     delta=delta*10+i;
                     j=i-1;
                     while(sign[j]==0)j--;
                     if(sign[j]==1)sum+=delta,delta=0;
                     else if(sign[j]==2)sum-=delta,delta=0;
                 }
            }else if(sign[i]==0)delta=delta*10+i;//i数字之后无符号
         }
         //最后一个数字9处理,因9之后无符号.需单独处理
         if(sign[8]==1)sum+=9;
         else if(sign[8]==2)sum-=9;
         else if(sign[8]==0){
             j=8,delta=delta*10+9;
             while(sign[j]==0)j--;
             if(sign[j]==1)sum+=delta;
             else if(sign[j]==2)sum-=delta;
        }    
        if(sum==100){
             for(i=1;i<9;i++){
                 printf("%d",i);
                 if(sign[i]==1)printf("+");
                 else if(sign[i]==2)printf("-");
             }
             printf("9=100\n");
         }
    }    
    return 0;
}

版本1

//核心思想,遇到"+"或"-",才开始计算之前的数据
//编着编者,感觉不对劲,还是决定开一个数组sign[i]用来存储i之后的符号情况
//sign[step]=1,j=step-1;while(sign[j]==0)j--;if(sign[j]==1)dfs(step+1,sum+delta*10+step,0);else if(sign[j]==2)dfs(step+1,sum-(delta*10+step),0);//此处写成sign[step]=1,j=step-1;while(sign[j]==0)j--;{if(sign[j]==1)dfs(step+1,sum+delta*10+step,0);}//"+"
//sign[step]=2,j=step-1;while(sign[j]==0)j--;if(sign[j]==2)dfs(step+1,sum-(delta*10+step),0);else if(sign[j]==1)dfs(step+1,sum+(delta*10+step),0);//此处写成sign[step]=2,j=step-1;while(sign[j]==0)j--;if(sign[j]==2)dfs(step+1,sum-(delta*10+step),0);//"-"
//上述2行的排查,经历了观察输出数据,静态阅读代码,大约60分钟.2019-2-18 15:55
//深搜代码写得挺狼狈,输出结果如下:
1+2+3-4+5+6+78+9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12+3-4+5+67+8+9=100
12-3-4+5-6+7+89=100
123+4-5+67-89=100
123+45-67+8-9=100
123-4-5-6-7+8-9=100
123-45-67+89=100
共计11个答案
//原以为20分钟能解决的问题,整整用去了半天,不过,挺值的,实实在在的解决了实际问题.2019-2-18 15:59
//多次想放弃该深搜算法,采用3进制的办法,但想着此处深搜弄不出,以后更复杂的问题就更难用深搜弄出,硬着头皮,调出来了.
#include <stdio.h>
#include <string.h>
int sign[15];//sign[i]//i之后的符号,无符号0,"+"1,"-"2
void dfs(int step,int sum,int delta){//step 当前步骤,sum是在step步骤之前计算的和,delta是到step步骤之前未计算的数
    int i,j;
    if(step==9){
        if(sign[step-1]==1)sum+=step;
        if(sign[step-1]==2)sum-=step;
        if(sign[step-1]==0){j=step-1;while(sign[j]==0)j--;if(sign[j]==1)sum+=delta*10+step;if(sign[j]==2)sum-=(delta*10+step);}
        if(sum==100)
        {
            for(j=1;j<9;j++){
                printf("%d",j);
                if(sign[j]==1)printf("+");
                if(sign[j]==2)printf("-");
            }
            printf("9=100\n");
        }
        return ;
    }
    if(sign[step-1]==1){//"+"
        sign[step]=1,dfs(step+1,sum+step,0);//"+"
        sign[step]=2,dfs(step+1,sum+step,0);//"-"
        sign[step]=0,dfs(step+1,sum,delta*10+step);//无符号
    }
    if(sign[step-1]==2){//"-"
        sign[step]=1,dfs(step+1,sum-step,0);//"+"
        sign[step]=2,dfs(step+1,sum-step,0);//"-"
        sign[step]=0,dfs(step+1,sum,delta*10+step);//无符号
    }
    if(sign[step-1]==0){
        sign[step]=1,j=step-1;while(sign[j]==0)j--;if(sign[j]==1)dfs(step+1,sum+delta*10+step,0);else if(sign[j]==2)dfs(step+1,sum-(delta*10+step),0);//此处写成sign[step]=1,j=step-1;while(sign[j]==0)j--;{if(sign[j]==1)dfs(step+1,sum+delta*10+step,0);}//"+"
        sign[step]=2,j=step-1;while(sign[j]==0)j--;if(sign[j]==2)dfs(step+1,sum-(delta*10+step),0);else if(sign[j]==1)dfs(step+1,sum+(delta*10+step),0);//此处写成sign[step]=2,j=step-1;while(sign[j]==0)j--;if(sign[j]==2)dfs(step+1,sum-(delta*10+step),0);//"-"
        sign[step]=0,dfs(step+1,sum,delta*10+step);//不填符号
    }
}
int main(){
    memset(sign,0,sizeof(sign));
    sign[0]=1;//"+" .初始化为"+"
    dfs(1,0,0);
    return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/57114.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

站长在线经典Python题:使用Python编程思想解决鸡兔同笼的问题的4种方法

欢迎你来到站长在线的Python题库&#xff0c;鸡兔写完Python教程以后&#xff0c;还是来一个Python的题目吧&#xff01;想来想去&#xff0c;还是写一个经典的题目为好&#xff0c;作为本栏目的第一个题目。我就想到了比较热门的题目《鸡兔同笼的问题》&#xff0c;本文不是用…

Qt常用的按钮控件编程(五)-- QCommandLinkButton 按钮

文章目录 前言7、QCommandLinkButton按钮7.1 例程功能和程序执行效果7.2 生成项目7.3 添加资源文件7.4 代码编辑7.4.1 修改项目文件 _radiobutton.pro7.4.2 修改 main.cpp7.4.3 修改 widget.h7.4.4 修改 widget.cpp 7.5 切换Kit&#xff0c;获得运行在不同系统中的运行的执行文…

【python】tkinter程序打包成exe可执行文件相关知识点记录

打包流程&#xff1a; 进入带打包的文件夹目录&#xff0c;输入“cmd” 在cmd对话框中输入 pyinstaller -F -w -i 【exe图标位置&#xff08;ico文件&#xff09;】【程序入口文件】 pyinstaller -F -w -i i.ico test.py 具体如图&#xff0c;图片摘自python利用pyinstaller打…

chatgpt赋能python:Python如何进行P图——探索Python图像处理库的可能性

Python如何进行P图——探索Python图像处理库的可能性 介绍 随着数字化时代的到来&#xff0c;图像处理已不再是专业领域的专属&#xff0c;许多人也开始接触和学习图像处理。我们常见的图像处理软件有Photoshop和GIMP等&#xff0c;而在Python编程领域中&#xff0c;也有很多…

面向对象程序设计 C++总结笔记(1)

面向对象程序设计 学习方法 理解基本原理掌握程序设计方法加强动手实践 课程目标 理解面向对象程序设计的基本原理&#xff0c;掌握面向对象技术的基本概念和封装性、继承性和多态性&#xff0c;能够具有面向对象程序设计思想。掌握C语言面向对象的基本特性和C语言基础知识&…

深度学习实战5-卷积神经网络(CNN)中文OCR识别项目

文章目录 一、前期工作 导入库图片生成函数导入数据生成数据集函数 二、CNN模型建立 三、训练模型函数 四、训练模型与结果 五、验证 大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来一个利用卷积神经网络&#xff08;CNN&#xff09;进行中文OCR识别&#xff0c;…

7个成功的DTC品牌出海营销策略,提高海外客户的忠诚度!

关键词&#xff1a;DTC品牌出海、DTC营销、客户忠诚度 近年来&#xff0c;普通消费者关心的事情发生了巨大变化。 60% 的消费者会特意从品牌而不是第三方零售商处购买。 从大型零售商处购买再成为主流。人们希望与他们关心并感到关心的品牌建立关系。他们希望支持独立企业并找到…

Cat.1热度居高不下,利尔达 NT26E系列模组带来更多新选择

2021年全球Cat.1处于爆发期&#xff0c;出货量达到1.2亿&#xff0c;仅在中国市场上&#xff0c;Cat.1出货量就达到了1.1亿。据近日市场研究公司Counterpoint最新的发布全球蜂窝物联网芯片跟踪报告&#xff0c;2021年第四季度&#xff0c;4G Cat.1出货量同比增长154%。今年的市…

Cat.1模组再添新选择,利尔达推出NT26U提供多元应用思路

Cat.1因模组成熟度高且可复用现有的LTE资源而广受欢迎&#xff0c;它不但成本低&#xff0c;还能在短时间内形成规模效应。随着2G/3G的加速退网&#xff0c;Cat.1作为中低速率应用场景中最适合保障通信能力的网络之一更是水涨船高。 基于展锐的Cat.1模组 作为LTE网络的“低配版…

短信接收流程

Android 短信接收流程 Android S 短信接收流程 Android 12 短信接收流程 指路 -> 短信发送流程 流程图

开题报告PPT怎么制作

毕业设计答辩的首要环节就是前期答辩&#xff0c;也叫作开题汇报答辩&#xff0c;主要内容是对后期设计制作的规划及时间安排&#xff0c;同时还有设计要达到什么目的效果&#xff0c;预测在制作工程中可能遇到的问题并且提出这些问题的解决方案&#xff0c;开题报告汇报时以PP…

springboot+微信小程序的点餐系统(开题报告+论文+答辩PPT+源码)

技术架构 SprongBootMysql微信小程序 简介 本点餐小程序是使用Java/JavaScript编程语言开发的&#xff0c;存储数据方面则用到了MySQL数据库。顾客可以使用小程序扫码功能扫描餐厅桌角的二维码就座&#xff0c;也可以点击排号等位由后台工作人员安排就座&#xff1b;通过首页…

毕业论文学术报告答辩开题报告PPT模板

模板介绍 毕业论文学术报告答辩开题报告PPT模板。一套论文答辩幻灯片模板&#xff0c;内含黑色,红色多种配色&#xff0c;风格设计&#xff0c;动态播放效果&#xff0c;精美实用。 希望下面这份精美的PPT模板能给你带来帮助&#xff0c;温馨提示&#xff1a;本资源使用PPT或…

python图片分享平台毕业设计开题报告

本文给出的python毕业设计开题报告&#xff0c;仅供参考&#xff01;&#xff08;具体模板和要求按照自己学校给的要求修改&#xff09; 选题目的和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的图片分享平台&#xff0c;整个网站项目使用了B/S架构…

高校通用论文开题报告PPT模板

模板介绍 高校通用论文开题报告PPT模板。一套开题报告幻灯片模板&#xff0c;内含青色,红色多种配色&#xff0c;风格设计&#xff0c;动态播放效果&#xff0c;精美实用。 希望下面这份精美的PPT模板能给你带来帮助&#xff0c;温馨提示&#xff1a;本资源使用PPT或PPTX等格…

计算机开题报告万能模板,计算机开题报告ppt模板

PPT内容 这是计算机开题报告ppt模板&#xff0c;包括了课题研究的意义和目的&#xff0c;论文提纲&#xff0c;研究的预期目标及主要特点及创新点&#xff0c;研究方法和途径等内容。 基于NS的无线网络的AODV路由协议仿真测试与性能分析 毕业论文开题报告 指导老师&#xff1a;…

chatglm+tesla m40低成本部署

chatglmtesla m40部署 tesla m40安装BIOS设置驱动下载并安装验证安装并切换WDDM模式 chatglm安装环境安装加载模型CUDA安装Torch安装源码修改 成功结果展示常见问题 本机配置 i5 13600k ,主板是微星760 bomer tesla m40安装 Tesla M40 24G实际上是计算卡&#xff0c;不是显卡&…

Win11 的这 19 个新功能,你都用上了吗?

Windows 11 是 Windows 的新版本&#xff0c;现在正在向受支持的 PC 推出多项新功能和改进。 Windows 11 于 10 月 5 日开始推出&#xff0c;微软也发布了 Windows 11 ISO 镜像。与之前的 Windows 10 更新不同&#xff0c;这个新的操作系统专注于面向消费者的功能和改进&#x…

使用WinINet和WinHTTP实现Http访问

Http访问有两种方式&#xff0c;GET和POST&#xff0c;就编程来说GET方式相对简单点&#xff0c;它不用向服务器提交数据&#xff0c;在这个例程中我使用POST方式&#xff0c;提交数据value1与value2&#xff0c;并从服务器得到他们的和&#xff08;value1 value2&#xff09;…

day02 创建第一个Windows窗口及Windows的消息处理

文章目录 第一个Windows窗口程序1. 入口函数2. 创建窗口类3. 注册窗口4. 创建窗口实例5. 处理消息事件6. 回调函数完整测试 Windows消息处理 第一个Windows窗口程序 1. 入口函数 Windows编程的入口函数&#xff1a; 建议直接F1查询官方文档&#xff0c;Ctrl CV int WINAPI W…