想用暴力求解法 来求解这个题目 为什么最后却没有输出 感觉自己的代码啥没有问题
B DEFA + --- + ------- = 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 ;
}
这个算式一共有多少种解法? 你这恐怕不行,因为c语言中int/int是等于int的
而原题明显存在两个小数拼成一个整数的情况 正如楼上所说,整数/整数得到的是整数
所以你不能用这个方法
这里值得一提的是 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;
}
要用暴力求解法
思路应该是这样的。
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]