完美综合运算式
以下含乘方(a∧b即为a的b次幂) 、加、减、乘、除的综合运算式(1) 的右边为一位的非负整数f, 请把数字0,1,2,…,9这10个数字中不同于数字f的9个数字不重复地填入式 (1) 左边的9个□中,□(约定数字“1”、“0”不出现在(1) 式左边的一位数中,且“0”不为首位) , 使得该综合运算式成立:
□`□+□□÷□-□□□×□=f(1)
满足上述要求的表达式 (1) 称为完美综合运算式。
输入非负整数f(0≤f≤9),输出相应的完美综合运算式。
为了解决这个问题,我们需要编写一个C语言程序,该程序会遍历所有可能的数字组合,并检查哪些组合满足给定的完美综合运算式。由于这是一个排列组合问题,并且涉及到浮点数运算(因为包含除法),所以我们需要仔细处理边界情况和精度问题。
#include <stdio.h>
#include <math.h>
int main() {
int a,b,c,d,e,f,z,g[10],k,t,m,n,x;
n=0;
scanf("%d",&f);
for(a=2; a<=9; a++)
for(b=2; b<=9; b++)
for(c=2; c<=9; c++)
for(d=102; d<=987; d++) //
for(e=2; e<=9; e++) {
for(t=1,k=1; k<=b; k++) t=t*a; // a^b
z=(d*e+f-t)*c;
if(z<10 || z>98) continue;
for(x=0; x<=9; x++) g[x]=0;
g[a]++;
g[b]++;
g[c]++;
g[e]++;
g[f]++; // g
g[d%10]++;
g[d/100]++;
m=(d/10)%10;
g[m]++;
g[z%10]++;
g[z/10]++;
for(t=0,x=0; x<=9; x++)
if(g[x]!=1) {
t=1; // 0-9
break;
}
if(t==0) {
n++; //
printf("%2d: %d^%d+%d/%d",n,a,b,z,c);
printf("-%d*%d=%d\n",d,e,f);
}
}
if(n==0) printf("No perfect expression.\n");
}
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
bool isPerfectExpression(int f, int a, int b, int c, int d, int e, int g, int h, int i) {
double result = pow(10.0 + a, b) + (100.0 + c * 10 + d) / e - (100.0 + g * 100 + h * 10 + i) * (f + 1);
// 由于涉及浮点数运算,需要设置一个较小的容差来比较结果
double tolerance = 1e-6;
return fabs(result - f) < tolerance;
}
void findPerfectExpressions(int f) {
int a,b,c,d,e,g,h,i;
for (a = 2; a <= 9; a++) { // 排除0和1作为乘方的底数
for ( b = 1; b <= 3; b++) { // 限制乘方次幂,防止结果过大
for (c = 1; c <= 9; c++) { // 排除0作为两位数的前一位
for ( d = 0; d <= 9; d++) { // 两位数的后一位可以是0
for (e = 1; e <= 9; e++) { // 排除0作为除数
for (g = 0; g <= 9; g++) { // 三位数的百位可以是0
for (h = 0; h <= 9; h++) { // 三位数的十位
for (i = 0; i <= 9; i++) { // 三位数的个位
if (isPerfectExpression(f, a, b, c, d, e, g, h, i)) {
printf("(%d`%d+%02d/%d-%03d*%d)=%d\n", a, b, c * 10 + d, e, g * 100 + h * 10 + i, f + 1, f);
}
}
}
}
}
}
}
}
}
}
int main() {
int f;
printf("请输入一个非负整数f(0≤f≤9): ");
scanf("%d", &f);
if (f < 0 || f > 9) {
printf("输入的f不在有效范围内。\n");
return 1;
}
printf("满足条件的完美综合运算式如下:\n");
findPerfectExpressions(f);
return 0;
}
在这个程序中,isPerfectExpression
函数检查给定的数字组合是否满足完美综合运算式。findPerfectExpressions
函数则遍历所有可能的数字组合,并调用 isPerfectExpression
函数来检查它们。如果找到满足条件的组合,就打印出来。
请注意,由于浮点数的精度问题,我们使用了 fabs
函数和一个小容差 tolerance
来比较浮点数结果是否接近整数 f
。这是因为直接比较浮点数和整数可能会导致由于舍入误差而错过正确的解。
此外,由于乘方运算可能导致结果非常大,我们限制了乘方的底数 a
在 2 到 9 之间,并且乘方的指数 b
在 1 到 3 之间,这是为了防止表达式的结果超出整数范围。如果需要检查所有可能的乘方,则需要对程序进行相应的调整。
运行这个程序时,用户需要输入一个非负整数 f
,然后程序会输出所有满足条件的完美综合运算式。
转载自CSDN-专业IT技术社区
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Joeeeem/article/details/136781254