小白期望变大神 发表于 2021-4-17 10:44:31

想用暴力求解法 来求解这个题目 为什么最后却没有输出 感觉自己的代码啥没有问题

   B      DEF
A + --- + ------- = 10
   C      GHI
   
(如果显示有问题,可以参见下图)



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

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

#include <stdio.h>

int main(){
    int count = 0 ;
    int s= 100;
    int a ;
    for (a = 0; a < 10; a++)
    {
      if (a!= a)
      for (a = 0; a < 10; a++)
      {
            if(a!=a&&a!=a)
             for (a = 0; a < 10; a++)
      {
            if(a!=a&&a!=a&&a!=a)
             for (a = 0; a < 10; a++)
      {
            if(a!=a&&a!=a&&a!=a&&a!=a)
             for (a = 0; a < 10; a++)
      {
         if(a!=a&&a!=a&&a!=a&&a!=a&&a!=a)
            for (a = 0; a < 10; a++)
      {
            if(a!=a&&a!=a&&a!=a&&a!=a&&a!=a&&a!=a)
            for (a = 0; a < 10; a++)
            {
            if(a!=a&&a!=a&&a!=a&&a!=a&&a!=a&&a!=a&&a!=a)
            for (a = 0; a < 10; a++)
            {
            if(a!=a&&a!=a&&a!=a&&a!=a&&a!=a&&a!=a&&a!=a&&a!=a)
         for (a = 0; a < 10; a++){
            if(a!=a&&a!=a&&a!=a&&a!=a&&a!=a&&a!=a&&a!=a&&a!=a&&a!=a)
                for (a = 0; a < 10; a++){

                if (a+a/a+(a*100+a*10+a/a*100+a*10+a)==10||a+(a*(a*100+a*10+a)+(a*(a*100+a*10+a))) / a*(a*100+a*10+a) == 10)
                {
                  count ++;
                }
               


                }
            }
            }
            }
      }
      }
      }
      }
      }
      
      
    }
    printf("%d",count);
    printf("%d",s);

    return 0 ;
}

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

wp231957 发表于 2021-4-17 12:37:31

你这恐怕不行,因为c语言中int/int是等于int的
而原题明显存在两个小数拼成一个整数的情况

人造人 发表于 2021-4-17 13:51:00

正如楼上所说,整数/整数得到的是整数
所以你不能用这个方法

这里值得一提的是 gcc 的 O3 优化是真的可怕,优化之前是 1分零2秒,优化之后是 14秒,^_^
#include <stdio.h>
#include <stdbool.h>

typedef struct {
    size_t count;
    size_t data;
} value_t;

void resolve_number(size_t data, size_t count) {
    for(ssize_t i = 8; i >= 0; --i) {
      data = count % 10;
      count /= 10;
    }
}

void value_init(value_t *v) {
    v->count = 123456789;
    resolve_number(v->data, v->count);
}

bool value_next(value_t *v) {
    ++v->count;
    resolve_number(v->data, v->count);
    return v->count < 1000000000;
}

bool verify(const value_t *v) {
    for(size_t i = 0; i < 9; ++i) {
      if(v->data == 0) return false;
      for(size_t j = i + 1; j < 9; ++j) {
            if(v->data == v->data)
                return false;
      }
    }
    return true;
}

bool calc(const value_t *v) {
    if(!verify(v)) return false;
    size_t m = 10 - v->data;
    size_t b = v->data;
    size_t c = v->data;
    size_t def = v->data * 100 + v->data * 10 + v->data;
    size_t ghi = v->data * 100 + v->data * 10 + v->data;
    b *= ghi; def *= c;
    c = ghi = c * ghi;
    return (b + def) == m * c;
}

int main(void) {
    value_t v;
    value_init(&v);
    do {
      if(calc(&v)) {
            printf("%lu+%lu/%lu+%lu%lu%lu/%lu%lu%lu\n",
                  v.data, v.data, v.data, v.data, v.data,
                  v.data, v.data, v.data, v.data);
      }
    } while(value_next(&v));
    return 0;
}

ba21 发表于 2021-4-17 18:56:21

要用暴力求解法
思路应该是这样的。
1. 取得1-9的排列组合。
2. 取出一组进行计算判断是否=10
#include <stdio.h>
#include <stdlib.h>
int n = 0; // 符合条件的数量

// 计算是否符合要求
void calc(int list[])
{
    int a, b, c, d, e; // 5个数

    a = list;
    b = list;
    c = list;

    d = list*100+list*10+list;
    e = list*100+list*10+list;

    if (a+b*1.0/c+d*1.0/e == 10)
    {
      printf("%d + %d/%d + %d/%d =10 \n", a, b, c, d, e);
      n++;
    }
}

// --------------- 以下部份为 获取1-9的排列组合----------
void swap(int *a, int *b)
{
    if (a==b) return;
    *a = *a^*b;
    *b = *a^*b;
    *a = *a^*b;
}
void perm(int list[], int k, int m)
{
    int i;
    if(k > m)
    {
      // 到了这表示获取到一组,组合。
      calc(list);
    }
    else
    {
      for(i = k; i <= m; i++)
      {
            swap(&list, &list);
            perm(list, k + 1, m);
            swap(&list, &list);
      }
    }
}

int main()
{
    int list={1,2,3,4,5,6,7,8,9};

    // 1-9进行排列组合,并计算是否符合要求
    perm(list, 0, 9-1);

    printf("total:%d\n", n);
    return 0;
}
页: [1]
查看完整版本: 想用暴力求解法 来求解这个题目 为什么最后却没有输出 感觉自己的代码啥没有问题