操作数的结合率

shancao 2008-06-30 09:07:13
乘法具有结合率
a*b*c有2种结合方法。a*b*c=(a*b)*c=a*(b*c)
a*b*c*d=(a*b)*(c*d)=((a*b)*c)*d=(a*(b*c))*d=a*(b*(c*d))=a*((b*c)*d)
编程实现n个操作数有多少种结合方法?
谢谢啦
...全文
64 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
K行天下 2008-07-01
  • 打赏
  • 举报
回复
前面那个全部用 X 表示的,改为以下形式:


#include <iostream>
#include <string>
#include <set>
using namespace std;

set<string> multiNum(int n)
{
if ( n < 2)
{
cerr<<"乘法个数小于2"<<endl;
}
else if ( n == 2 )
{
set<string> s;
s.insert("X*X");
return s;
}
else if( n > 2)
{
set<string> sn1 = multiNum(n-1);
set<string> s;
set<string>::iterator sitern1 = sn1.begin();

while(sitern1 != sn1.end())
{
string str = *sitern1;
for(int i=0;i<str.size();i++)
{
if(str[i] == 'X')
{
string temp;
if( i == 0)
temp = string("(X*X)")+string(str,i+1,str.size()-i-1);
else if( i == str.size()-1)
temp = string(str,0,i)+string("(X*X)");
else
temp = string(str,0,i)+string("(X*X)")+string(str,i+1,str.size()-i-1);
s.insert(temp);
}
}
sitern1++;
}
return s;
}
}


void turn2alpha(set<string> s)
{
set<string>::iterator siter = s.begin();
while(siter!=s.end())
{
string s = *siter;
char* myAlpha = new char[2];
myAlpha[0] = 'a';
myAlpha[1] = '\0';
for(int i=0; i<s.size(); i++)
{
if(s[i] == 'X')
{
s.replace(i,1,myAlpha);
++*myAlpha;
}
}
delete[] myAlpha;
cout<<s<<endl;
siter++;
}

}
int main()
{
for(int i =2; i<6; i++)
{
/*
set<string> s = multiNum(i);
set<string>::iterator siter = s.begin();

while(siter != s.end())
{
cout<<*siter<<endl;//最后转换输出
siter++;
}*/
cout<<i<<"个乘数的所有结合律如下:"<<endl;
turn2alpha(multiNum(i));
}

cin.get();

cout<<"10个乘数的所有结合律如下:"<<endl;
turn2alpha(multiNum(10));

cin.get();
return 0;
}

K行天下 2008-07-01
  • 打赏
  • 举报
回复
做了一个:

#include <iostream>
#include <string>
#include <set>
using namespace std;

set<string> multiNum(int n)
{
if ( n < 2)
{
cerr<<"乘法个数小于2"<<endl;
}
else if ( n == 2 )
{
set<string> s;
s.insert("X*X");
return s;
}
else if( n > 2)
{
set<string> sn1 = multiNum(n-1);
set<string> s;
set<string>::iterator sitern1 = sn1.begin();

while(sitern1!=sn1.end())
{
string str = *sitern1;
cout<<"string str = *sitern1 "<<str<<endl;
cout<<str.size();
for(int i=0;i<str.size();i++)
{
if(str[i] == 'X')
{
string temp;
cout<<endl<<"遇见X"<<temp<<endl<<endl;
temp = string(str,i-1)+string("(X*X)")+string(str,i+1,str.size()-i-1);
s.insert(temp);

}
}
}
return s;
}
}

int main()
{
set<string> s = multiNum(2);
set<string>::iterator siter = s.begin();
while(siter != s.end())
{
cout<<*siter<<endl;//最后转换输出
siter++;
}

multiNum(3);
cin.get();
return 0;
}

wjb_yd 2008-06-30
  • 打赏
  • 举报
回复
动态规划
wargrey 2008-06-30
  • 打赏
  • 举报
回复
思路,递归实现


a*b*c*d...*z=a*B(B=b*c*d...*z),出口条件是只到B为一个成数的情况

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧