/*输入两个字符串(都是字母) a到z每个字母有一个权值(1-26) 不区分大小
写 哪个字母分配哪个权值由你决定 字符串的权值就是字符串中所有字母的权值之和
现要求自行分配权值 使得两个字符串的权值之差最大 输出最大权值之差(提示:先把
字符串中的相同字母去掉,再分配权值)*/
#include<iostream>
#include<string>
using namespace std;
int MaxWeight(string str1,string str2)
{
//去掉相同字母后26个字母的对应个数
int diffString[26]={0};
int index=0;
for(int i=0;i<str1.length();i++)
{
index=str1[i]-'a';
++diffString[index];
}
for(i=0;i<str2.length();i++)
{
index=str2[i]-'a';
--diffString[index];
}
/*for(i=0;i<26;i++)
cout<<diffString[i]<<',';
cout<<endl;*/
//对diffString数组进行排序
int temp;
for(i=0;i<26;i++)
for(int j=24;j>=i;j--)
if(diffString[j+1]<diffString[j])
{
temp=diffString[j+1];
diffString[j+1]=diffString[j];
diffString[j]=temp;
}
/*for(i=0;i<26;i++)
cout<<diffString[i]<<',';
cout<<endl;*/
//得到整个数组的总和
temp=0;
for(i=0;i<26;i++)
temp+=diffString[i];
int result=0;
if(temp<0)//如果和小于0的话,则按26->1的递减方式分配权值
{
for(i=0;i<26;++i)
result+=diffString[i]*(26-i);//计算最大权值,其中(26-i)是分配的权值
}
else
{//否则按照1->26的方式递增分配权值
for(i=0;i<26;++i)
result+=diffString[i]*(i+1);//计算最大权值,其中(i+1)是分配的权值
}
//cout<<abs(result)<<endl;
return abs(result);//计算结果可能为负,取绝对值
}
int main()
{
string str1;
cout<<"input str1:";
cin>>str1;//="acdafgt";
string str2;
cout<<"input str2:";
cin>>str2;//="abcmxy";
cout<<"result is:"<<MaxWeight(str1,str2)<<endl;
return 0;
}
/*
走廊上有n盏灯 按1到n序号顺序排好 刚开始都是关着的 现有n个人,编号1到n
编号为1的人从走廊一端走到另一端 把编号是1的倍数的灯开关都动一下(开变关,
关变开),接着编号是2的人把编号是2的倍数的灯开关都动一下。。。一直到第n个人
输入:n
输出:最后还有几盏灯是亮着的
*/
#include<iostream>
#include<vector>
using namespace std;
int StillLighten(int n)
{
int count=0;//最后亮着的灯的个数int n
vector<int> lighten(n+1,0);
//按规则改变灯的状态
for(int i=1;i<=n;i++)
for(int j=i;j <= n;j=j+i)
{
if(lighten[j]==0)
lighten[j]=1;
else
lighten[j]=0;
}
//计算最后亮着的灯的个数
for(i=1;i<=n;i++)
count+=lighten[i];
return count;
}
int main()
{
int n;
cout<<"number of lights:"<<endl;
cin>>n;
cout<<"still lighten:"<<endl;
cout<<StillLighten(n)<<endl;
return 0;
}
/*去饭店吃饭 一个男人3元 一个女人2元 一个小孩1元 现输入总人数和总花费
问有几种不同的组合方式(必须至少有一个男人一个女人一个小孩) */
#include<iostream>
using namespace std;
int CountOfComposition(int moneySum,int numOfPeople)
{
int numOfMan = 0;//男人数量
int numOfWoman = 0;//女人数量
int numOfChild = 0;//小孩数量
int count = 0;//组合方式
if(moneySum >= 3 * numOfPeople)
return count;
for(numOfMan=1;numOfMan<numOfPeople+1;++numOfMan)
for(numOfWoman=1;numOfWoman<numOfPeople+1;++numOfWoman)
for(numOfChild=1;numOfChild<numOfPeople+1;++numOfChild)
{
if((3*numOfMan+2*numOfWoman+1*numOfChild == moneySum)&&(numOfMan+numOfWoman+numOfChild == numOfPeople))
++count;
}
return count;
}
int main()
{
int moneySum;
int numOfPeople;
cout<<"input moneySum and numOfPeople:"<<endl;
cin>>moneySum;
cin>>numOfPeople;
int count = CountOfComposition(moneySum,numOfPeople);
cout<<"count of composition is :"<<count<<endl;
return 0;
}
/*输入一个字符串,判断这个字符串中的括号是否匹配(只针对小括号和中括号),没有
括号就认为是匹配的。若匹配则输出0,否则输出1.括号必须成对出现,([)]的情况认为是
不匹配的。
输入:his name is Jack(a well known person in [Pirates of the Caribbean])
输出:0 */
#include<iostream>
#include<stack>
using namespace std;
int IsStringMatch(char *str)
{
int isMatch = 0;
if(!str)
isMatch = -1;
std::stack<char> charStack;
while(*str != '\0')
{
switch(*str)
{
//如果是左括号'('或'['则入栈
case '(':
case '[':
charStack.push(*str);
break;
//如果是')'且栈首元素不是'('则匹配失败返回1
case ')':
{
if((charStack.top()!='(')||charStack.empty())
isMatch = 1;
else
charStack.pop();
}
break;
//如果是']'且栈首元素不是'['则匹配失败返回1
case ']':
{
if((charStack.top()!='[')||charStack.empty())
isMatch = 1;
else
charStack.pop();
}
break;
}
++str;
}
if(!charStack.empty())
isMatch = 1;
return isMatch;
}
int main()
{
char str[] = "his name is Jack(a well known person in ([Pirates of the Caribbean])";
int n = IsStringMatch(str);
cout<<"is match?:"<<n<<endl;
return 0;
}
/*输入五个人的身高,身高值介于160~190之间。找到身高差值最小的两个人,并从小到大
输出,若出现差值相等的情况,请输出身高较高的那一组。
输入:176,178,165,180,181
输出:180,181 */
#include<iostream>
#include<vector>
using namespace std;
//输入满足条件的五个人的身高
vector<int> InputFiveHeight()
{
int temp;
vector<int> height;
while(height.size()<5)
{
cin>>temp;
if((temp>=160)&&(temp<=190))
height.push_back(temp);
else
cout<<"input invalid! please input >=160 and <=190:"<<endl;
}
return height;
}
//找到最小差值的身高对并输出最小差值以及身高对
void FindMinDifHeight(const vector<int> &height)
{
vector<int> twoHeight;
int size=height.size();
int min=height[0];
for(int i=0;i<size;i++)
for(int j=i+1;j<size;j++)
{
int diff=abs(height[i]-height[j]);
if(min>diff)//找到最小差值,并把身高对放入容器中
{
min=diff;
twoHeight.clear();
twoHeight.push_back(height[i]);
twoHeight.push_back(height[j]);
}
if(min==diff)
{
min=diff;//如果差值相等,则保存更高的那组身高对
if(((height[i]>twoHeight[0])&&(height[i]>twoHeight[1]))||((height[j]>twoHeight[0])&&(height[j]>twoHeight[1])))
{//如果新组的其中一个值大于旧组的任何一个,则新组是身高更高的身高对,保存在容器中
twoHeight.clear();
twoHeight.push_back(height[i]);
twoHeight.push_back(height[j]);
}
}
}
//输出最小差值以及身高更高的身高对
cout<<"minDiff:"<<min<<endl;
cout<<"Two Height is:"<<endl;
vector<int>::iterator iter;
for(iter=twoHeight.begin();iter!=twoHeight.end();++iter)
cout<<*iter<<endl;
}
int main()
{
const vector<int> height = InputFiveHeight();
FindMinDifHeight(height);
return 0;
}
/*
七步之内得到一个回文数字。
随意输入一个数字,如果不是回文数字,则加上该数的逆转,如此最多七步得到回文数字。
例如输入:68,不是回文则68+86=154,不是回文则154+451=506,不是回文则506+605=1111是回文,输出1111.
加逆转不能超过七次。
*/
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
bool IsHuiWen(string str)//判断字符串是不是回文字符串
{
int length=str.length();
for(int i=0;i<length/2;i++)
if(str[i]!=str[length-i-1])
return false;
return true;
}
string IntToString(int num)//int转换为字符串
{
string strRet;
char strTemp[50];
sprintf(strTemp, "%d", num);
strRet = strTemp;
return strRet;
}
int main()
{
int num;
cin>>num;//输入数字
string str;
str=IntToString(num);//将数字转换为字符串
string strNotRev(str);
for(int i=0;i<7;i++)//七步之内构造出回文数字
{
if(IsHuiWen(str))//如果已经是回文数字,输出该数字,退出程序
{
cout<<str<<endl;
break;
}
else//否则加上该数字的逆转
{
int tempInt=atoi(strNotRev.c_str());//得到原字符串代表的数
reverse(str.begin(),str.end());//逆转字符串得到新字符串
tempInt+=atoi(str.c_str());//加上新字符串代表的数
str=IntToString(tempInt);//为下一次判断是否为回文数字,先将原字符串和逆转之后的字符串相加的和转换为string类型
strNotRev =str;//保存此时的新字符串
}
}
return 0;
}
以上代码VC6.0环境下测试通过。