永发信息网

如何编一个C语言的函数

答案:1  悬赏:50  手机版
解决时间 2021-04-14 08:57
  • 提问者网友:心牵心
  • 2021-04-14 05:03

编一个函数,功能要求是来随机输出右边的一种运算符 /,*,-,+

并且能进行加减乘除运算

例如:给你五个数字:1、2、3、4、5,用上上面给出的运算符(每种只能用一次),算出来要等于22,并且打印出来计算的表达式

最佳答案
  • 五星知识达人网友:雾月
  • 2021-04-14 06:19
这是我以前写的暴力代码,方法就是简单地枚举所有可能的排列,然后插入操作符进行计算。修改了下给你贴过来:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int NextNM(int* a, int n, int m)
{
int i;
for(i = 0; i < n; ++i)
if(a[i] != m-1)
break;
if(i == n)
return 0;
i = n-1;
++a[i];
while(a[i] == m && i >= 0) {
a[i] = 0;
a[--i]++;
}
return 1;
}

int AsceCmp(const void* a, const void* b)
{
return *(const int*)a - *(const int*)b;
}

void Swap(int* a, int* b)
{
int t;
t = *a;*a = *b;*b = t;
}

void Reverse(int* begin, int* end)
{
while(begin < end)
Swap(begin++, --end);
}

int NextC(int* begin, int* mid, int* end)
{
int* p, *k;
p = mid;
while(1) {
if(p == begin)
return 0;
k = p;
if(*--p < *k) {
int* r = end;
while(*--r < *p);
if(r < mid)
continue;
Swap(r, p);
if(k < mid) {
qsort(k, r-k, sizeof(int), AsceCmp);
Reverse(mid, r);
}
return 1;
}
}
}

int eval(int* a, int n, int* op)
{
int* p, i, sum;
p = (int*)malloc(sizeof(int)*n);
memcpy(p, a, sizeof(int)*n);

for(i = 0; i < n-1; ++i)
if(op[i] == 2)
p[i+1] = p[i] * p[i+1], p[i] = 0;
else if(op[i] == 1)
p[i+1] = -p[i+1];
sum = 0;
for(i = 0; i < n; ++i)
sum += p[i];
return sum;
}

void Get(int* a, int N, int g)
{
int* b = (int*)malloc(sizeof(int)*N);
int* c = (int*)calloc(N-1, sizeof(int));
char op[] = "+-*";
int mid, i, j, n, *k;

for(mid = 1; mid <=N-1; ++mid) {
Reverse(a + mid, a + N-1);
do {
j = 0, k = a;
memset(b, 0, sizeof(int)*N);
for(i = 1; i <= N; ++i) {
(b[j] *= 10) += i;
if(k < a + mid && i == *k)
j++, k++;
}
memset(c, 0, sizeof(int)*(N-1));

do {
n = eval(b, j+1, c);
if(n == g) {
printf("%d", b[0]);
for(i = 0; i < mid; ++i) {
putchar(op[c[i]]);
printf("%d", b[i+1]);
}
printf("=%d\n", eval(b, j+1, c));
}
}while(NextNM(c, mid, 3));
}while(NextC(a, a + mid, a + N-1));
qsort(a, N-1, sizeof(int), AsceCmp);
}
free(b);
free(c);
}


int main()
{
int a[] = {1,2,3,4,5}; // 候选分割数字
Get(a, sizeof(a) / sizeof(a[0]), 22);
return 0;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯