算法.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行进行判断,如果算式的计算结果与输入的结果相符,则表示找到一种解法,输出该解。

对不起,写着程序有点上头.自己研究一下.注意值得左右,中间干了什么.


(0)

相关推荐