解题思路:穷举,暴力搜索,嵌套两个循环,遍历三个数字的位数情况,一个数字最多7位,最少1位。
s1 s2 s3分别用来存储三个数字,按照题设可以转换成目标==>判断s1+s2/s3是否等于输入的数字
自定义一个ss函数进行深度搜索,
再定义一个全局变量数组t,分别存进1~9,当其中哪个数字被用掉了,那么就将这个数字t[i]变成负的,例如7,用完了就改成-7,这样回溯的时候再乘一个-1就变回原样了。
判断条件是否成立有两种方法,要么就是转换成浮点型直接进行比较,要么就是保持整型,先判断s2%s3是否为0(也就是能否整除),再判断s1+s2/s3是否等于你输入的数。
注意事项:
参考代码:
#include <stdio.h>
#include <stdlib.h>
void ss(int a,int b,int c,int s1,int s2,int s3,int n,int u);
int t[9]={1,2,3,4,5,6,7,8,9};
int count=0;
int main(int argc, char *argv[]) {
int a,b,c,u;
int s1=0,s2=0,s3=0;
scanf("%d",&u);
for(a=1;a<=7;a++)
for(b=a+1;b<=8;b++)
{
ss(a,b,9,s1,s2,s3,1,u);//a指第一个数字的位数,b指第一第二个数字的位数之和,c指三个数字的位数之和(就是9)
s1=0;s2=0;s3=0;
}
printf("%d",count);
return 0;
}
void ss(int a,int b,int c,int s1,int s2,int s3,int n,int u){//abc分别指三个数的总位数,s1 s2 s3分别指三个数,n指目前已经处理好了n-1个数字,u是输入的数字
int i=0,j=0;
if(n<=a)
{
for (i=0;i<9;i++)
{if(t[i]>0)
{
s1=10*s1+t[i];
t[i]=-1*t[i];
ss(a,b,c,s1,s2,s3,n+1,u);
t[i]=-1*t[i];
s1=(s1-t[i])/10;}
}
}
else if(n>a&&n<=b)
{
for (i=0;i<9;i++)
{ if(t[i]>0)
{
s2=10*s2+t[i];
t[i]=-1*t[i];
ss(a,b,c,s1,s2,s3,n+1,u);
t[i]=-1*t[i];
s2=(s2-t[i])/10;}
}
}
else if(n>b&&n<=c)
{
for (i=0;i<9;i++)
{if(t[i]>0)
{
s3=10*s3+t[i];
t[i]=-1*t[i];
ss(a,b,c,s1,s2,s3,n+1,u);
t[i]=-1*t[i];
s3=(s3-t[i])/10;}
}
}
if(n==10)
{
if(s2%s3==0&&((s1+s2/s3)==u))
count++;
}
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复