求帮改个代码~
我现在要完成9 8 7 6 5 4 3 2 1=0
这个等式,其中加减乘除符号都是各用两次。
我现在已有代码它是把所有不限制符号使用次数的情况都列出来了,我现在想改为4种符号各用两次,请大神门帮忙改一下。急求:
#include<stdio.h>
#include<stdafx.h>
#include<stdlib.h>
#define BLOCK_SIZE 1024
#define MAX_LEN 20
/**********************全局数据区****************************/
const char *filein="in.txt"; //输入文件
const char *fileout="out.txt"; //输出文件
int num[MAX_LEN]; //存储从文件读取的整数
int num_len=0; //存储整数数组的实际长度
int sign[MAX_LEN]; //存储整数中间的符号
int sign_len=0; //存储符号的实际长度
int result=0; //存储期望结果
float t_result=0; //存储实际结果
char op[]={'+','-','*','/'}; //
char buffer[BLOCK_SIZE]; //输出记录的缓冲区
int buffer_len=0; //buffer的实际长度
/**********************全局数据区****************************/
/**********************函数声明开始****************************/
void read(const char * filename,int num[],int *num_len,int *result);
void generator(int sign_point);
void getResult();
float calc(float a,int p,float b);
void writeBuffer();
void convertINTtoSTR(int num,char str[],int * str_len);
void writefile(const char * filename ,const char * buffer);
void showNum(int num[],int num_len);
void showSign(int sign[],int sign_len);
void showBuffer(char * buffer);
/**********************函数声明结束****************************/
int main()
{
read(filein,num,&num_len,&result);
showNum(num,num_len);
generator(0);
showBuffer(buffer);
buffer[buffer_len]='\0';
writefile(fileout,buffer);
getchar();
return 0;
}
/**********************函数定义开始****************************/
/******************************************************
*函数功能:从文件中读取整数
*参数说明:*filename 文件名
* num[] 存储整数的数组
num_len 数组长度
*result 期望结果
*******************************************************/
void read(const char * filename,int num[],int *num_len,int *result){
int c;
int tmp=0;
FILE *fp=fopen(filename,"r+");
if(!fp){
printf("error to open file ");
return ;
}
while((c=fgetc(fp))!=EOF)
{
if(c==32)
{
num[(*num_len)++]=tmp;
tmp=0;
}else if(c>='0' && c<='9'){
tmp=tmp*10+c-'0';
}
}
(*result)=tmp;
fclose(fp);
//(*num_len)=(*num_len)+1;
sign_len=(*num_len)-1;
}
/******************************************************
*函数功能:递归产生所以可能的符号组合
*参数说明:sign_point 当前符号位置指针
*******************************************************/
void generator(int sign_point){
//负责产生一种运算符可能的排列情况
//参数 sign_point 指示当前指针在数组sign中的位置
//程序采用递归方式,
// 如果sign_point==len则说明sign_point已经指向数组尾部,也就是说现在sign数组中的状态代表了一种可能的运算符排列情况
// 否则
// a所指向的那个sign[sign_point]元素(运算符)有{+,-,*,/}四种可能,分别用{0,1,2,3}来表示
// 当sign[sign_point]运算符确定后,指针继续下移一位,再次调用generator函数
if(sign_point==sign_len){
showSign(sign,sign_len);
getResult();
//printf("reslut=%d,t_result=%f\n",result,t_result);
writeBuffer();
}else{
for(int i=0;i<4;i++){
sign[sign_point]=i;
generator(sign_point+1);
}
}
}
/******************************************************
*函数功能:计算表达式的实际结果
*******************************************************/
void getResult(){
//为了方便计算,假设在num[0]前还有个0+,即是0+num[0]
float left=0;
int op_cur=0;
float right=num[0];
for(int i=0;i<sign_len;i++){
if(sign[i]<2){
//如果当前符号为加减,就计算前面的两个数的运算值
left=calc(left,op_cur,right);
op_cur=sign[i];
right=num[i+1];
}else{
//如果当前符号为乘除,因为乘除优先级高,就计算当前符号位后面的数和right的运算值
right=calc(right,sign[i],num[i+1]);
}
}
//计算最后的结果
t_result=calc(left,op_cur,right);
}
/******************************************************
*函数功能:计算两个数的四则运算值
*******************************************************/
float calc(float a,int p,float b){
//这里做除法操作时,如果b=0会产生错误
switch(p){
case 0:
return a+b;
case 1:
return a-b;
case 2:
return a*b;
case 3:
return a/b;
}
}
/******************************************************
*函数功能:把符合条件的记录写入缓冲区
*******************************************************/
void writeBuffer(){
int tmp=0;
char str[4];//整数最多为4位
int str_len=0;
if((float)t_result==result){
for(int i=0;i<num_len;i++)
{
//把数字num[i]转换成字符类型
convertINTtoSTR(num[i],str,&str_len);
for(int j=str_len-1;j>=0;j--){
buffer[buffer_len++]=str[j];
}
buffer[buffer_len++]=op[sign[i]];
}
buffer[buffer_len-1]='=';
//把数字result转换成字符类型
convertINTtoSTR((int)result,str,&str_len);
for(int j=str_len-1;j>=0;j--){
buffer[buffer_len++]=str[j];
}
//添加换行符
buffer[buffer_len++]='\n';
//如果缓冲区快满了,就调用writefile()函数写入文件,并清空缓冲区
if(buffer_len>BLOCK_SIZE-50){
buffer[buffer_len]='\0';
writefile(fileout,buffer);
buffer_len=0;
}
}
}
/******************************************************
*函数功能:把整数转换为字符数组 (倒序存储的)
*参数说明:num 要转换的整数
* str 字符数组
str_len 转换后的字符数组长度
*******************************************************/
void convertINTtoSTR(int num,char str[],int * str_len){
(*str_len)=0;
if(num<=0){
str[(*str_len)++]=0+'0';
return;
}
while(num){
str[(*str_len)++]=(num%10)+'0';
num=num/10;
}
}
/******************************************************
*函数功能:写缓冲区内容到文件
*******************************************************/
void writefile(const char * filename ,const char * buffer){
FILE *fp=fopen(filename,"w");
if(!fp){
printf("error to open file");
return ;
}
//函数遇到'\0'结束
fputs(buffer,fp);
fclose(fp);
}
/**********************函数定义结束****************************/
/****************辅助函数,用于输出数据区内容*****************/
void showNum(int num[],int num_len){
for(int i=0;i<num_len;i++){
//printf("%d ",num[i]);
}
//printf("\n%d\n",result);
}
void showSign(int sign[],int sign_len){
for(int i=0;i<sign_len;i++){
//printf("%d ",sign[i]);
}
//printf("\n");
}
void showBuffer(char * buffer){
printf("%s",buffer);
}
/****************辅助函数,用于输出数据内容*****************/
[解决办法]
这么长的代码。。懒得看。。
最简单的你在它将所有情况列出来那里判断一下是否每种符号各有两个就行了。。
[解决办法]
搜索 + 回溯