//
FindValue.cpp : Defines the entry point for the console application.
/*
1. 给定等式 A B C D E 其中每个字母代表一个数字,且不同数字对应不
D F G 同字母。编程求出这些数字并且打出这个数字的
+ D F G 算术计算竖式。
───────
X Y Z D E
*/
// 作者: xmxoxo
// 编写: 2006.11.21
// 版本: v1.0
/* 简单算法,直接一个个找,并没有具体分析
其实数字正好10个,正好是0-9,题目转换成
如何输出0-9的全排列,然后在这些排列中寻找
满足条件的排列.
*/
#include " stdafx.h "
#include " iostream.h "
#include " time.h "
#include " string.h "
// 输出算式
void out ( char v[ 10 ])
{
cout << " " << v[ 0 ] << v[ 1 ] << v[ 2 ] << v[ 3 ] << v[ 4 ] << endl;
cout << " " << v[ 3 ] << v[ 5 ] << v[ 6 ] << endl;
cout << " + " << v[ 3 ] << v[ 5 ] << v[ 6 ] << endl;
cout << " ─────── " << endl;
cout << " " << v[ 7 ] << v[ 8 ] << v[ 9 ] << v[ 3 ] << v[ 4 ] << endl;
}
// 判断条件
bool isok( char va[ 10 ])
{
int a,b,c;
int v[ 10 ],i;
for (i = 0 ;i < 10 ;i ++ )
{
v[i] = va[i] - ' 0 ' ;
}
a = v[ 0 ] * 10000 + v[ 1 ] * 1000 + v[ 2 ] * 100 + v[ 3 ] * 10 + v[ 4 ];
b = v[ 3 ] * 100 + v[ 5 ] * 10 + v[ 6 ];
c = v[ 7 ] * 10000 + v[ 8 ] * 1000 + v[ 9 ] * 100 + v[ 3 ] * 10 + v[ 4 ];
if (a + b + b == c)
{
return 1 ;
}
else
{
return 0 ;
}
}
// 用递归的思路输出全排列
void fooEx( char first[], char text[])
{
// int intRet=0;
int i = 0 ;
int len = 0 ;
char tmp[ 256 ];
char f[ 256 ];
char newf[ 2 ];
char * strret;
long j = 0 ;
len = strlen(text);
// intRet = FooCount(len);
// 如果只有一个字符
if (len == 1 )
{
// printf("%s",first);
// 打印字符串,并换行
// printf("%s ",text);
strret = strcat(first,text);
if (isok(strret))
{
out (strret);
}
}
else
{
// 如果是多个字符,则依次打出每个字符
for (i = 0 ;i < len;i ++ )
{
strcpy(f,first);
// 取出第一个字符,
newf[ 0 ] = text[i];
newf[ 1 ] = '
/*
1. 给定等式 A B C D E 其中每个字母代表一个数字,且不同数字对应不
D F G 同字母。编程求出这些数字并且打出这个数字的
+ D F G 算术计算竖式。
───────
X Y Z D E
*/
// 作者: xmxoxo
// 编写: 2006.11.21
// 版本: v1.0
/* 简单算法,直接一个个找,并没有具体分析
其实数字正好10个,正好是0-9,题目转换成
如何输出0-9的全排列,然后在这些排列中寻找
满足条件的排列.
*/
#include " stdafx.h "
#include " iostream.h "
#include " time.h "
#include " string.h "
// 输出算式
void out ( char v[ 10 ])
{
cout << " " << v[ 0 ] << v[ 1 ] << v[ 2 ] << v[ 3 ] << v[ 4 ] << endl;
cout << " " << v[ 3 ] << v[ 5 ] << v[ 6 ] << endl;
cout << " + " << v[ 3 ] << v[ 5 ] << v[ 6 ] << endl;
cout << " ─────── " << endl;
cout << " " << v[ 7 ] << v[ 8 ] << v[ 9 ] << v[ 3 ] << v[ 4 ] << endl;
}
// 判断条件
bool isok( char va[ 10 ])
{
int a,b,c;
int v[ 10 ],i;
for (i = 0 ;i < 10 ;i ++ )
{
v[i] = va[i] - ' 0 ' ;
}
a = v[ 0 ] * 10000 + v[ 1 ] * 1000 + v[ 2 ] * 100 + v[ 3 ] * 10 + v[ 4 ];
b = v[ 3 ] * 100 + v[ 5 ] * 10 + v[ 6 ];
c = v[ 7 ] * 10000 + v[ 8 ] * 1000 + v[ 9 ] * 100 + v[ 3 ] * 10 + v[ 4 ];
if (a + b + b == c)
{
return 1 ;
}
else
{
return 0 ;
}
}
// 用递归的思路输出全排列
void fooEx( char first[], char text[])
{
// int intRet=0;
int i = 0 ;
int len = 0 ;
char tmp[ 256 ];
char f[ 256 ];
char newf[ 2 ];
char * strret;
long j = 0 ;
len = strlen(text);
// intRet = FooCount(len);
// 如果只有一个字符
if (len == 1 )
{
// printf("%s",first);
// 打印字符串,并换行
// printf("%s ",text);
strret = strcat(first,text);
if (isok(strret))
{
out (strret);
}
}
else
{
// 如果是多个字符,则依次打出每个字符
for (i = 0 ;i < len;i ++ )
{
strcpy(f,first);
// 取出第一个字符,
newf[ 0 ] = text[i];
newf[ 1 ] = '
结果:
29786
850
+ 850
───────
31486
Press any key to continue