凑算式--16年蓝桥杯--C/C++ B组---C

在这里插入图片描述

这个算式中A到I代表代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

答案:29


#include<stdio.h>
//a对应题目中的A,b,c对应B,C,m对应DEF组成的三位整数,n对GHI对应的三位整数

    int chong(int f)//用于检查三位数中有无重复数字,没有则返回1,有则返回0,特别注意别忘了检查零,有零直接返回0
  {
   int ge,shi,bai;
   ge = f%10;
   shi = (f%100-ge)/10;
   bai = f/100;
   if(ge!=shi&&ge!=bai&&shi!=bai&&ge!=0&&shi!=0&&bai!=0)
   return 1;
   else
   return 0;
  }

int end(int a,int b ,int c,int m, int n)//输入一次不重复的排列,检查是否符合题意,符合返回1,不符合返回0
         {
         if (10-a==(b*n+c*m)/(c*n)&&(b*n+c*m)%(c*n)==0)//防止小数计算对式子进行变形,只要满足这两个式子就符合题意
         return 1;
         else
         return 0;
         }



int main()
{
int t[6],p[3]={0,0,0};//t[6]储存m,n中的互不重复数字
int a,b,c,m,n,i,sum = 0;
int y;//y用来接受检测重复的函数chong的返回值

for(m = 123;m<=987;m++)

   {
   y = chong(m);
   if(y == 0)  continue;//yan等于零说明有重复数字,进入m的下一循环

   else  {
                    t[0] = m/100;
                    t[1] = (m%100-m%10)/10;
                    t[2] = m%10;

        for(n=987;n>=123;n--)
               {
               y = chong(n);
               if(y  == 0)continue;//y等于零说明n本身有重复数字,进入n的下一循环
               else
                    {
                    t[3] =  n/100;
                    t[4] = (n%100-n%10)/10;
                    t[5] =  n%10;


                    if(t[3]==t[0] || t[3]==t[1] || t[3]==t[2]) continue;//下面三行保证n里数字和m不相同,如有相同直接进入n的下一循环
                    if(t[4]==t[0] || t[4]==t[1] || t[4]==t[2]) continue;
                    if(t[5]==t[0] || t[5]==t[1] || t[5]==t[2]) continue;



                             p[0]=0;p[1]=0;p[2]=0;//每次循环初始化一遍p
                                for (i=1;i<=9;i++)//找出m,n没用过的三个数输到数组p里
                           {
                              if(i!=t[0] && i!=t[1] && i!=t[2] && i!=t[3] && i!=t[4] && i!=t[5])
                                    {
                                  if(p[0]==0)
                                      {
                                       p[0] =i;  continue;
                                      }

                                 if(p[1]==0)
                                      {
                                       p[1] =i;  continue;
                                      }

                                 if(p[2]==0)
                                      {
                                       p[2] =i;  break;
                                      }

                                    }
                            }

              //下面手动全排列数组p中未被m,n使用的三位数字在a,b,c的位置,并带入到检查结果的函数中,若符合题目要求sum就加一
                        a = p[0]; b = p[1]; c=p[2];     y = end(a,b,c,m,n);     if(y==1)sum++;
                        a = p[0]; b = p[2]; c=p[1];     y = end(a,b,c,m,n);     if(y==1)sum++;
                        a = p[1]; b = p[0]; c=p[2];     y = end(a,b,c,m,n);     if(y==1)sum++;
                        a = p[1]; b = p[2]; c=p[0];     y = end(a,b,c,m,n);     if(y==1)sum++;
                        a = p[2]; b = p[1]; c=p[0];     y = end(a,b,c,m,n);     if(y==1)sum++;
                        a = p[2]; b = p[0]; c=p[1];     y = end(a,b,c,m,n);     if(y==1)sum++;

                     }

              }

          }

   }
    printf("%d",sum);
   return  0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值