有一个未完成的等式:1 2 3 4 5 6 7 8 9=N
当给出整数N的具体值后,请你在2,3,4,5,6,7,8,9这8个数字的每一个前面,或插入运算符号“+”,或插入一个运算符号“-”,或不插入任何运算符号,使等式成立,并统计出能使等式成立的算式总数,若无解,则输出0。
例如:取N为108时,共能写出15个不同的等式,以下就是其中的二个算式:
1+23+4+56+7+8+9=108
123-45+6+7+8+9=108
输入一个数N

输出一个数,表示能使等式成立的算式总数。

方法一:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include "stdio.h"
using namespace std;
#define N 9
//把数字转换为字符串
string convertstrtoint(int j){
stringstream tempstream;
tempstream<<j;
string i;
tempstream>>i;
tempstream.clear();
tempstream.str("");
return i;
}
void init(int*a,int num){
int temp=10; a[0]=1;
for(int i=1;i<num;i++)
{
a[i]=temp;
temp=temp*10;
}
}
int garr[]={1,2,3,4,5,6,7,8,9};
int mulnumi[10];
//将数组中的数,组合成整数
int GetNumFromArr(int* b,int num)
{
int tempsum=0;
int tempnum=0; for(int i=num-1;i>=0;i--)
{
tempnum=b[i]*mulnumi[num-i-1];
tempsum+=tempnum;
}
return tempsum;
} void GetExpressResult(int* arr,int num,int expectval,int curval,int* pnum,string rstr)
{ int temp=0;
for(int i=0;i<num;i++){
temp=GetNumFromArr(arr,i+1);
if(i+1==num)
{ if(curval==temp)
{
cout<<rstr<<"+"+convertstrtoint(temp)<<endl;
(*pnum)++;
return;
}
if(curval==-temp){
cout<<rstr<<"-"+convertstrtoint(temp)<<endl;
(*pnum)++;
return;
}
else
{
//cout<<rstr<<endl;
return ;
}
}
else if(i+1<num)
{
GetExpressResult(arr+1+i,num-1-i,expectval,curval-temp,pnum,rstr+"+"+convertstrtoint(temp));
if(num<N)
GetExpressResult(arr+1+i,num-1-i,expectval,curval+temp,pnum,rstr+"-"+convertstrtoint(temp)); }
}
} int _tmain(int argc, _TCHAR* argv[])
{
init(mulnumi,10);
int res=0;//存放有多少个表达式
int *p=garr+N;
GetExpressResult(garr,N,5,5,&res,string(""));
cout<<"total:"<<res<<endl;
getchar();
return 0;
}

方法二:

#include <iostream>
#include <cmath>
using namespace std; int func (const char* str, int num);
bool calc (const char* result, int num);
void display(const char* result); int main()
{
const char str[] = "123456789";
int num;
cout << "input num: ";
cin >> num;
cout << "result: " << func(str, num) << endl;
return 0;
} int func(const char* str, int num)
{
//初始化输出数组
int len = strlen(str);
char* result = new char[len*2];
for (int i = 0; i < len; i++)
{
result[i*2] = str[i];
}
result[len*2-1] = '\0'; //模拟3进制的运算
char key[3] = {' ', '+', '-'};
int n = pow(3.0, len - 1);
int ret = 0;
for (int i = 0; i < n; i++)
{
//把i转换成3进制,计算每一位,转换成字符,填入字符串相应位置
int pos = len * 2 - 3; //个位数填入位置
int temp = i, mod;
do
{
mod = temp % 3;
temp /= 3;
result[pos] = key[mod];
pos -= 2;
}while (temp > 0);
//高位补0
while (pos > 0)
{
result[pos] = key[0];
pos -= 2;
}
if (calc(result, num)) //计算结果并输出
ret++;
} delete[] result;
return ret;
} bool calc(const char* result, int num)
{
int sum = 0, sign = 1, i = 0;
int temp = 0;
while (result[i] != '\0')
{
if (result[i] == ' ')
{
temp *= 10;
}
else if(result[i] == '+' || result[i] == '-')
{
sign = (result[i] == '+') ? 1 : -1;
sum += temp;
temp = 0;
}
else
{
temp += sign * (result[i] - '0');
}
i++;
}
sum += temp;
if (sum == num)
{
display(result); //输出结果
return true;
}
else
return false;
} void display(const char* result)
{
for (int i = 0; i < strlen(result); i++)
if (result[i] != ' ')
cout << result[i];
cout << endl;
}

方法三:

#include <stdio.h>

/*返回两个数合并的情况*/
int HeBin(int arry[],int i,int j)
{
int num=0;
for(;i<=j;i++)
{
num = num*10 + arry[i];
}
return num;
}
//a为装载1~9的数组,n为当前数组所用到的数字顺序 ,g为输入的值
int Digui(int a[],int n,int g)
{
static int sum1=0;
int i=n;
if(n > 0)
{
for(i = n;i >=0;i--)
{
if(i != 0)
{
Digui(a,i-1,g-HeBin(a,i,n)); //数字合并加减的情况
Digui(a,i-1,g+HeBin(a,i,n));
}else
{
if(g - HeBin(a,0,n) == 0)
{
// printf("%d - %d (0 , %d)\n",g,HeBin(a,0,n),n);
sum1++; //符合条件的情况时,sum1加一
}
return sum1;
}
}
Digui(a,n-1,g-a[i]); //单个数字的加减的情况
Digui(a,n-1,g+a[i]); }else if(n == 0)
{
if(0 == g - a[n])
sum1++; //符号情况时加一
}
return sum1;
} int main()
{
int a[] = {1,2,3,4,5,6,7,8,9};
int goal;
while(1 != (scanf("%d",&goal)));
goal = Digui(a,8,goal);
printf("%d\n",goal);
return 0;
}

方法四:

/*---------------------------------------
函数型计算器(VC++6.0,Win32 Console)程序由 yu_hua 于2007-07-27设计完成
功能:
目前提供了10多个常用数学函数:
⑴正弦sin
⑵余弦cos
⑶正切tan
⑷开平方sqrt
⑸反正弦arcsin
⑹反余弦arccos
⑺反正切arctan
⑻常用对数lg
⑼自然对数ln
⑽e指数exp
⑾乘幂函数∧
用法:
如果要求2的32次幂,可以打入2^32<回车>
如果要求30度角的正切可键入tan(Pi/6)<回车>
注意不能打入:tan(30)<Enter>
如果要求1.23弧度的正弦,有几种方法都有效:
sin(1.23)<Enter>
sin 1.23 <Enter>
sin1.23 <Enter>
如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter>
此外两函数表达式连在一起,自动理解为相乘如:sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77)
当然你还可以依据三角变换,再用sin(1.23+0.77)也即sin2验证一下。
本计算器充分考虑了运算符的优先级因此诸如:2+3*4^2 实际上相当于:2+(3*(4*4))
另外函数名前面如果是数字,那么自动认为二者相乘.
同理,如果某数的右侧是左括号,则自动认为该数与括弧项之间隐含一乘号。
如:3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1)
又如:4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5)
此外,本计算器提供了圆周率 Pi键入字母时不区分大小写,以方便使用。
----------------------------------------*/
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <stdio.h>
#include <string.h>
#include <windows.h>
using namespace std;
const char Tab=0x9;
const int DIGIT=1;
const int MAXLEN=16384;
char s[MAXLEN],*endss;
int pcs=15;
double fun(double x,char op[],int *iop) {
while (op[*iop-1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>
switch (op[*iop-1]) {
case 7: x=sin(x); (*iop)--;break;
case 8: x=cos(x); (*iop)--;break;
case 9: x=tan(x); (*iop)--;break;
case 10: x=sqrt(x); (*iop)--;break;
case 11: x=asin(x); (*iop)--;break;
case 12: x=acos(x); (*iop)--;break;
case 13: x=atan(x); (*iop)--;break;
case 14: x=log10(x);(*iop)--;break;
case 15: x=log(x); (*iop)--;break;
case 16: x=exp(x); (*iop)--;break;
}
return x;
}
double calc(char *expr,char **addr) {
static int deep; //递归深度
static char *fname[]={ "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp",NULL};
double ST[10]={0.0}; //数字栈
char op[10]={'+'}; //运算符栈
char c,*rexp,*pp,*pf;
int ist=1,iop=1,last,i;
if (!deep) {
pp=pf=expr;
do {
c = *pp++;
if (c!=' '&& c!=Tab)
*pf++ = c;
} while (c!='\0');
}
pp=expr;
if ((c=*pp)=='-'||c=='+') {
op[0] = c;
pp++;
}
last = !DIGIT;
while ((c=*pp)!='\0') {
if (c=='(') {//左圆括弧
deep++;
ST[ist++]=calc(++pp,addr);
deep--;
ST[ist-1]=fun(ST[ist-1],op,&iop);
pp = *addr;
last = DIGIT;
if (*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2)) {//目的是:当右圆括弧的右恻为左圆括弧或函数名字时,默认其为乘法
op[iop++]='*';
last = !DIGIT;
c = op[--iop];
goto operate ;
}
}
else if (c==')') {//右圆括弧
pp++;
break;
} else if (isalpha(c)) {
if (!strnicmp(pp,"Pi",2)) {
if (last==DIGIT) {
cout<< "π左侧遇)" <<endl;exit(1);
}
ST[ist++]=3.14159265358979323846264338328;
ST[ist-1]=fun(ST[ist-1],op,&iop);
pp += 2;
last = DIGIT;
if (!strnicmp(pp,"Pi",2)) {
cout<< "两个π相连" <<endl;exit(2);
}
if (*pp=='(') {
cout<< "π右侧遇(" <<endl;exit(3);
}
} else {
for (i=0; (pf=fname[i])!=NULL; i++)
if (!strnicmp(pp,pf,strlen(pf))) break;
if (pf!=NULL) {
op[iop++] = 07+i;
pp += strlen(pf);
} else {
cout<< "陌生函数名" <<endl;exit(4);
}
}
} else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='^') {
char cc;
if (last != DIGIT) {
cout<< "运算符粘连" <<endl;exit(5);
}
pp++;
if (c=='+'||c=='-') {
do {
cc = op[--iop];
--ist;
switch (cc) {
case '+': ST[ist-1] += ST[ist];break;
case '-': ST[ist-1] -= ST[ist];break;
case '*': ST[ist-1] *= ST[ist];break;
case '/': ST[ist-1] /= ST[ist];break;
case '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;
}
} while (iop);
op[iop++] = c;
} else if (c=='*'||c=='/') {
operate: cc = op[iop-1];
if (cc=='+'||cc=='-') {
op[iop++] = c;
} else {
--ist;
op[iop-1] = c;
switch (cc) {
case '*': ST[ist-1] *= ST[ist];break;
case '/': ST[ist-1] /= ST[ist];break;
case '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;
}
}
} else {
cc = op[iop-1];
if (cc=='^') {
cout<< "乘幂符连用" <<endl;exit(6);
}
op[iop++] = c;
}
last = !DIGIT;
} else {
if (last == DIGIT) {
cout<< "两数字粘连" <<endl;exit(7);
}
ST[ist++]=strtod(pp,&rexp);
ST[ist-1]=fun(ST[ist-1],op,&iop);
if (pp == rexp) {
cout<< "非法字符" <<endl;exit(8);
}
pp = rexp;
last = DIGIT;
if (*pp == '('||isalpha(*pp)) {
op[iop++]='*';
last = !DIGIT;
c = op[--iop];
goto operate ;
}
}
}
*addr=pp;
if (iop>=ist) {
cout<< "表达式有误" <<endl;exit(9);
}
while (iop) {
--ist;
switch (op[--iop]) {
case '+': ST[ist-1] += ST[ist];break;
case '-': ST[ist-1] -= ST[ist];break;
case '*': ST[ist-1] *= ST[ist];break;
case '/': ST[ist-1] /= ST[ist];break;
case '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;
}
}
return ST[0];
}
int main(int argc,char **argv) {
//1 2 3 4 5 6 7 8 9 =110 中间可以挿+ - 或者不挿 如果1 2 不挿的话 就是12
char op[4]=" +-";
int g1;
int g2;
int g3;
int g4;
int g5;
int g6;
int g7;
int g8; for (g1=0;g1<3;g1++)
for (g2=0;g2<3;g2++)
for (g3=0;g3<3;g3++)
for (g4=0;g4<3;g4++)
for (g5=0;g5<3;g5++)
for (g6=0;g6<3;g6++)
for (g7=0;g7<3;g7++)
for (g8=0;g8<3;g8++) {
strcpy(s,"1 2 3 4 5 6 7 8 9");
s[ 1]=op[g1];
s[ 3]=op[g2];
s[ 5]=op[g3];
s[ 7]=op[g4];
s[ 9]=op[g5];
s[11]=op[g6];
s[13]=op[g7];
s[15]=op[g8];
if (110.0==calc(s,&endss)) printf("%s=110\n",s);
}
/*
if (argc<=1) {
if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页
cout << "计算函数表达式的值。"<<endl<<"支持(),+,-,*,/,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp"<<endl;
while (1) {
cout << "请输入表达式:";
gets(s);
if (s[0]==0) break;//
cout << s <<"=";
cout << setprecision(15) << calc(s,&endss) << endl;
}
} else {
strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;
if (argc>=3) {
pcs=atoi(argv[2]);
if (pcs<0||15<pcs) pcs=15;
printf("%.*lf\n",pcs,calc(s,&endss));
} else {
printf("%.15lg\n",calc(s,&endss));
}
}
*/
return 0;
}
//123+4+5+67-89=110
//123+4-5-6-7-8+9=110
//123-4+5-6-7+8-9=110
//123-4-5+6+7-8-9=110
//12+34+56+7-8+9=110
//12+3+45+67-8-9=110
//12-3+4-5+6+7+89=110
//1+234-56-78+9=110
//1+2+34+5+67-8+9=110
//1-2+3+45-6+78-9=110

来源于贴子:
http://bbs.csdn.net/topics/390592099,觉得不错,就整理出来了,没有进行验证与测试,有兴趣的朋友可以试试。

转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12176817

整型数组处理算法(八)插入(+、-、空格)完成的等式:1 2 3 4 5 6 7 8 9=N[华为面试题]的更多相关文章

  1. 实验12:Problem H: 整型数组运算符重载

    Home Web Board ProblemSet Standing Status Statistics   Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...

  2. c# 计算一个整型数组的平均

    一个整型数组的平均: class Program { static void Main(string[] args) { ,,,,,,,,,}; double avg= GetAvg(array); ...

  3. Java整型数组的最大长度到底有多长?

    Java整型数组的最大长度到底有多长? 今天上网查了一下,各种说法都有,这个问题似乎总困扰我们Java初学者,无奈,只好自己试了一下,以下是我的测试代码,如果有错误,还望不吝赐教! 使用eclipse ...

  4. Android jni 编程4(对基本类型二维整型数组的操作)

    Android jni 编程 对于整型二维数组操作: 类型一:传入二维整型数组,返回一个整型值 类型二:传入二维整型数组,返回一个二维整型数组 声明方法: private native int Sum ...

  5. Android jni 编程3(对基本类型一维整型数组的操作)总结版

    主要学习资料:黑马程序员的NDK方法使用(生产类库so)              jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.c ...

  6. Android jni 编程2(对基本类型一维整型数组的操作)

    参考教程和这位博主的对一维数组的处理,主要包括以下三种类型: //传入一维数组,无返回值 public native void arrayEncode(int[] arr); //传一个一维数组和数组 ...

  7. 剑指offer40:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字

    1 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 2 思路和方法 (1)异或:除了有两个数字只出现了一次,其他数字都出现了两次.异或运算中,任 ...

  8. 057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和

    057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和 本文知识点:求整型数组的数组元素的元素值累加和 案例:求整型数 ...

  9. js获取整型数组最大值、最小值、平均值

    ---恢复内容开始--- let values = [];//数组(整型数字) //获取数组最大值function arrMaxNum(arr){ var maxNum = null; for (va ...

随机推荐

  1. MyKTV项目,走起!

    MyKTV项目,走起! 第一部分:这个项目对于新手来说有一点难度,但是当你理清类之间的关系和怎样去实现功能后就会感觉轻松很多. 话不多说,先上类图: 接着是数据库表间关系: 本项目要实现以下功能: 明 ...

  2. Maven 镜像

    http://mvnrepository.com/http://search.maven.org/http://repository.sonatype.org/content/groups/publi ...

  3. TODO、FIXME和XXX转载

    代码中特殊的注释技术——TODO.FIXME和XXX的用处 // TODO Auto-generated method stub

  4. SQL Server 2008 R2 的版本和组件

    SQL Server 2008 R2 的版本和组件 SQL Server 2008 R2   其他版本 SQL Server 2008 SQL Server 2005 SQL Server 2012 ...

  5. css动态样式

    一种 var style=document.createElement("style"); style.type="text/css"; style.appen ...

  6. 1.1HTML的基本概念

    1.WWW有3个基本的组成部分,分别是URL(统一资源定位器),HTTP(超文本传输协议),HTML(本文本标记语言). 2.一个HTML文件是由一系列的元素和标签组成的,元素不区分大小写. 3.&l ...

  7. thrift的简单实现

    1.使用windows实现,首先在apache官网下载一个thrift的编译工具,在项目中建一个文件叫add.thrift的文件,内容如下: namespace java com.vipshop.sa ...

  8. win7 64位 python3.4&opencv3.0配置安装

    参考:http://blog.csdn.net/sun7_she/article/details/50051249 一.安装Python 下载Python3.4.2 网址:https://www.py ...

  9. 转:6款Java转C#的最佳工

    原文来自于:http://designzum.com/2014/03/27/best-tools-to-convert-java-to-c-source-code/ ava is the class ...

  10. IL2CPP的前世今生

    在2014年年中的时候,Unity3D官方博客上却发了一篇"The future of scripting in unity"的文章,引出了IL2CPP的概念,感觉有取代Mono之 ...