解题思路:穷举,暴力搜索,嵌套两个循环,遍历三个数字的位数情况,一个数字最多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二级辅导-计负均正 (C++代码)浏览:946 |
C语言程序设计教程(第三版)课后习题6.8 (C语言代码)浏览:723 |
WU-printf基础练习2 (C++代码)浏览:2061 |
1124题解浏览:630 |
C二级辅导-进制转换 (C语言代码)浏览:750 |
上车人数 (C语言代码)浏览:752 |
小O的乘积 (C++代码)浏览:796 |
简单的a+b (C语言代码)浏览:672 |
小O的乘积 (C++代码)浏览:545 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:725 |