CUCA


私信TA

用户名:CUCA

访问量:341

签 名:

等  级
排  名 58074
经  验 235
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校 南京师范大学
专  业

  自我简介:

TA的其他文章

纯C暴力搜索
浏览:288

解题思路:穷举,暴力搜索,嵌套两个循环,遍历三个数字的位数情况,一个数字最多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 人评分

  评论区

  • «
  • »