算法.1
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int oldprice, price = 0, i = 0;
printf("请设置商品的真实价格");
scanf("%d", &oldprice);
system("cls"); //清屏隐藏价格
printf("请输入尝试的价格");
while (oldprice != price)
{ //循环检测商品价格
i++;
printf("参与者");
scanf("%d", &price);
printf("主持人");
if (price > oldprice)
{
printf("高了\n");
}
else
{
printf("恭喜你猜中了,这个是你的了\n\n你一猜了%d\n", i);
}
}
getchar();
return (0);
// scanf("%d", &)
}
for (size_t i = 0; i < count; i++)
{
for (size_t i = 0; i < count; i++)
{
for (size_t i = 0; i < count; i++)
{
for (size_t i = 0; i < count; i++)
{
for (size_t i = 0; i < count; i++)
{
for (size_t i = 0; i < count; i++)
{
for (size_t i = 0; i < count; i++)
{
for (size_t i = 0; i < count; i++)
{
if (x, y, z, o, p, q满足验证条件)
{
printf("输出正确答案")
/* code */
}
/* code */
}
/* code */
}
/* code */
}
/* code */
}
/* code */
}
/* code */
}
/* code */
}
/* code */
}
穷举法的常用格式
我要是平时写出这种代码,可以去死了.总之就是一种搜索遍所有可能性方法的算法.要是算力够,完全ok.
根据图算式可看出,共有5个汉字,每个汉字都可以为数字0~9中的一个数;接着,就可分别用数字0~9去替换各汉字,验证计算的结果是否和列出的算式相等,若相等,则找到一个正确的答案。
要使算式有意义,“算”字和“题”字就不能为0。
例如,假设各汉字为以下情况:
算—1;
法—2;
描—3;
述—4;
题—5;
则算式所示。
就是这样
显然,这个算式是不成立的。当该算式不成立时,改变其中一个汉字所代表的数字,再次进行验证。如此循环,在把每个汉字可能代表的数字(0~9)都验算过之后,就可找出正确答案。如果全部循环后还没有找到正确答案,则说明该题无解。
#include <stdlib.h>
int main()
{
int i1, i2, i3, i4, i5; //设置“算法描述题”5个汉字为整型变量
long multi, result; //输出的结果为长整型
for (i1 = 1; i1 <= 9; i1++)
{
for (i2 = 0; i2 <= 9; i2++)
{
for (i3 = 0; i3 <= 9; i3++)
{
for (i4 = 0; i4 <= 9; i4++)
{
for (i5 = 1; i5 <= 9; i5++)
{
multi = i1 * 10000 + i2 * 1000 + i3 * 100 + i4 * 10 + i5;
result = i5 * 100000 + i5 * 10000 + i5 * 1000 + i5 * 100 + i5 * 10 + i5;
if (multi * i1 == result)
{
printf("\n%5d%2d%2d%2d%2d\n", i1, i2, i3, i4, i5);
printf("X%12d\n", i1);
printf("%3d%2d%2d%2d%2d%2d\n", i5, i5, i5, i5, i5, i5);
}
}
}
}
}
}
getch();
return 0;
}
程序不难,小儿科.就是这种东西要一口气写完.如果半路走绳.写起来比较恶心
在以上程序中,变量i1、i2、i3、i4、i5分别代表汉字“算”“法”“描”“述”“题”,其中“算”字和“题”字可能为1~9中的一个数(第6行和第14行的两个循环语句),而其他各汉字可为0~9中的一个(第8、10、12行的三个循环语句)。
·第16行将5个变量组合为被乘数。
·第17行用变量i5存放算式的结果。
·第18行判断算式是否成立,若算式成立,则执行第19~24行输出符合条件的算式。
接下来的例子可能有点重复,但是有一个小技巧在里面;
具体的题目是:在下面的算式中适当地添加“+”“-”“×”“÷”运算符,使等式成立(不使用括号)。
5 5 5 5 5=5
分析该题,这是1个由5个数组成的算式,一共需要填入4个运算符,而每两个数之间的运算符有4种选择(加、减、乘、除),通过循环程序可枚举填入这4个运算符之一,然后再判断算式是否成立。
由于算术表达式的特殊性,在编程求解这个算式时,需要注意以下两点:
·当填入除号时,要求右侧的数不能为0。
·乘除的运算级别比加减高。
对于第1点,在程序中添加一个判断语句,如果试算时填入的运算符是除(/),则其后面的数不能为0;若为0,则跳过该次试算,直接进行下一轮计算。
对于第2点,处理起来就要麻烦一点。考虑以下的算式:
5+5-5*5/5=5
技巧 : 在程序中可设置两个变量left和right,left用来保存上次的运算结果(下次运算的左侧内容),right用来保存下次将参加运算的数据(即下次运算的右侧内容)。
对于前两个运算符(加和减),可以很简单地进行运算,对于第3个运算符(乘),因为其运算级别比前面的减要高,因此需要先计算减号右侧的算式,这时可以保存左侧内容(left变量)为“5+5”的值,直接用右侧内容(right变量的值)乘以下一个运算数据,并将结果保存在右侧内容(right变量)中。按同样的方式处理最后一个运算符(除)。这样,左侧变量left中的值为“5+5”的值,右侧变量right中的值为“5*5/5”的值,最后将left和right中的值进行运算,即可得到整个表达式的值。
根据以上分析,编写以下代码。为了使程序具有一定的通用性,设置成可由用户输入表达式的5个运算数据和一个结果数据,具体代码如下:
#include <stdio.h>
int main()
{
int j, i[5]; //循环变量 ,数组i用来表示4个运算符
int sign;
// 加运算时的符号 int result; //保存运算式的结果值
int count = 0; //计数器,统计符合条件的方案
int num[6]; //保存操作数 float left,right; //保存中间结果
char oper[5] = {' ', '+', '-', '*', '/'}; //运算符
int result;
printf("请输入5个数:");
for (j = 1; j <= 5; j++)
scanf("%d", &num[j]);
printf("请输入结果:");
scanf("%d", &result);
for (i[1] = 1; i[1] <= 4; i[1]++) //循环4种运算符,1表示+,2表示-,3表示*,4表示/
{
if ((i[1] < 4) || (num[2] != 0)) //运算符若是/,则第二个运算数不能为0
{
for (i[2] = 1; i[2] <= 4; i[2]++)
{
if ((i[2] < 4) || (num[3] != 0)) //运算符若是/,则第三个运算数不能为0
{
for (i[3] = 1; i[3] <= 4; i[3]++)
{
if ((i[3] < 4) || num[4] != 0) //运算符若是/,则第四个运算数不能为0
{
for (i[4] = 1; i[4] <= 4; i[4]++)
{
if ((i[4] < 4) || (num[5] != 0))
//运算符若是/,则第五个运算数不能为0
{
int left = 0;
int right = num[1];
int sign = 1;
for (j = 1; j <= 4; j++)
{
switch (oper[i[j]])
{
case '+':
left = left + sign * right;
sign = 1;
right = num[j + 1];
break;
case '-':
left = left + sign * right;
sign = -1;
right = num[j + 1];
break; //通过f=-1实现减法
case '*':
right = right * num[j + 1];
break; //实现乘法
case '/':
right = right / num[j + 1]; //实现除法
break;
}
}
if (left + sign * right == result)
{
count++;
printf("%3d:", count);
for (j = 1; j <= 4; j++)
printf("%d%c", num[j], oper[i[j]]);
printf("%d=%d\n", num[5], result);
}
}
}
}
}
}
}
}
}
if (count == 0)
printf("没有符合要求的方法!\n");
getch();
return 0;
}
·第4~10行定义程序中需要使用的变量,各变量的作用在右侧的注释中已说明。
·第11~15行接收用户输入的运算数据和结果值。
·第16、20、24、28行使用循环语句循环处理加、减、乘、除4种运算符。
·第18、22、26、30行使用条件判断语句,处理除号后的数字不能为0的情况。
·第35~56行将4种运算符填入对应位置,并对算式进行运算。
·第57~64行进行判断,如果算式的计算结果与输入的结果相符,则表示找到一种解法,输出该解。
对不起,写着程序有点上头.自己研究一下.注意值得左右,中间干了什么.