1-9组成的等式

// p1230.cpp : Defines the entry point for the console application.
/*
题目
用1-9这9个数,组成一个等式,
乘数3位数,被乘数2位数,结果为4位数
*/
//

#include "stdafx.h"
#include "stdlib.h"
#include "iostream.h"
#include "string.h"

//返回长度
int getlen(int a)
{
 int r;
 char s[10];

 itoa(a,s,10);
 r = strlen(s);
 return r;
}

//组合
char* getstr(int a,int b,int c)
{
 char s1[10];
 char s2[10];
 char s3[10];
 
 char *r;

 itoa(a,s1,10);
 itoa(b,s2,10);
 itoa(c,s3,10);
 r = new char[30];
 r[0]='/0';
 strcat(r,s1);
 strcat(r,s2);
 strcat(r,s3);
 return r;
}

//获取数a的右起第k位
int getnum(int a,int k)
{
 int r,l;
 char s[10];

 itoa(a,s,10);
 l = strlen(s);
 if (k>l)
 {
  r=-1;
 }
 else
 {
  r = s[l-k] - '0';
 }

 return r;
}

//是否重复
bool isre(int a)
{
 char s[10];
 int arr[10];
 int i,j;
 
 //初始化
 for (i=0;i<10;i++){arr[i]=0;}

 //三个数连成一个字串
 itoa(a,s,10);

 for (i=0;i<(signed int)strlen(s);i++)
 {
  j=s[i]-'0';
  if (j== 0){return false;}
  if (arr[j]==1){return false;}
  if (arr[j]==0){arr[j]++;}
 }

 return true;
}


//判断是否由1-9组成
bool isok(int a,int b,int c)
{
 char *s;
 int arr[10];
 int i,j;
 
 //初始化
 for (i=0;i<10;i++){arr[i]=0;}

 //三个数连成一个字串
 s=getstr(a,b,c);

 for (i=0;i<(signed int)strlen(s);i++)
 {
  j=s[i]-'0';
  if (j== 0){return false;}
  if (arr[j]==1){return false;}
  if (arr[j]==0){arr[j]++;}
 }

 return true;
}

//输出结果
void out(int a, int b, int c)
{
 cout << a << " X " << b << " = " << c <<endl;
}

int main()
{
 int i,j,k;

 for (i=11;i<=99;i++)
 {
  if (isre(i))
  {
   for (j=111;j<=999;j++)
   {
    if (isre(j))
    {
     k=i*j;
     if (isok(i,j,k)){out(i,j,k);}
    }
   }
  }
 }
 return 0;
}

结果:

138 X 42 = 5796
157 X 28 = 4396
159 X 48 = 7632
186 X 39 = 7254
198 X 27 = 5346
297 X 18 = 5346
483 X 12 = 5796

 

### 题目重述 题目要求:找到所有用数字1-9不重复组成的带分数形式满足等式 `A + B/C + DEF/GHI = n` 的解。给定的代码在输入10时输出了5,解释其原因。 ### 代码重述及修正 原代码存在一些语法错误和逻辑问题。以下是修正后的代码及其解释: ```c #include <iostream> #include <algorithm> using namespace std; int main() { int n, cnt = 0; int d[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; do { int a = d[0]; if (a >= n) continue; // 确保A < n int b = d[1], c = d[2]; if (b % c != 0) continue; // 确保B/C是一个整数 int x = d[3] * 100 + d[4] * 10 + d[5]; // DEF int y = d[6] * 100 + d[7] * 10 + d[8]; // GHI if (y == 0 || x % y != 0) continue; // 确保GHI不为0并且DEF/GHI是一个整数 if (a + b / c + x / y == n) { cnt++; } } while (next_permutation(d, d + 9)); cout << cnt << endl; return 0; } ``` ### 代码解析 1. **数组初始化**:数组`d`包含数字19,确保每个数字只使用一次。 2. **循环遍历排列**:使用`next_permutation`函数生成所有可能的数字排列。 3. **条件检查**: - 确保`A < n`。 - 确保`B/C`是一个整数。 - 确保`DEF/GHI`是一个整数且分母不为零。 4. **计数满足条件的组合**:如果当前排列满足等式`A + B/C + DEF/GHI = n`,计数器`cnt`加1。 5. **输出结果**:最终输出满足条件的组合总数。 ### 为什么输入10输出了5 当输入`n = 10`时,代码输出了5,这意味着有5种不同的排列方式可以使得等式`A + B/C + DEF/GHI = 10`成立。具体原因如下: - 代码遍历了所有由19组成的排列。 - 对于每个排列,它检查是否满足`A + B/C + DEF/GHI = 10`。 - 如果满足条件,计数器`cnt`增加。 - 最终,程序找到了5个符合条件的排列。 ### 知识点 1. **`next_permutation`函数** - 用于生成下一个排列组合。 2. **整数除法** - 在C++中,两个整数相除的结果是整数,舍去小数部分。 3. **条件判断** - 使用`if`语句进行条件判断,确保计算的合法性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值