1.输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50。
代码:
#include "stdafx.h"
#include<iostream>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
int dataLen;
int data[50];
cin>>dataLen;
for(int i=0;i<dataLen;i++)
cin>>data[i];
int max=data[0];
int min=data[0];
for(int i=0;i<dataLen;i++)
{
if(max<data[i])
max=data[i];
if(min>data[i])
min=data[i];
}
cout<<min+max<<endl;
}
2.大数相加
用STL的string比较方便,代码如下,自己测了几组数据没有什么问题。
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
//求两个长长整型的数据的和并输出
string s1,s2;
string s3;
getline(cin,s1);
getline(cin,s2);
int len1=s1.length();
int len2=s2.length();
int lenMax=len1>len2?len1:len2;
s3.resize(lenMax+1);
int temp1,temp2,temp3,temp4=0;
int i=len1-1;
int j=len2-1;
int k=lenMax;
while(i>=0||j>=0)
{
if(i>=0)
temp1=s1[i]-'0';
else
temp1=0;
if(j>=0)
temp2=s2[j]-'0';
else
temp2=0;
temp3=(temp1+temp2+temp4)%10; //本位
temp4=(temp1+temp2+temp4)/10; //进位
s3[k]=temp3+'0';
i--;
j--;
k--;
if(i<0&&j<0)
{
if(temp4!=0)
s3[k]=temp4+'0';
else
s3.erase(s3.begin());
break;
}
}
cout<<s3<<endl;
}
2.求两个长长整型的数据的和并输出,例如输入1233333333333333 。。。 3111111111111111111111111.。。。,则输出。。。
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
//求两个长长整型的数据的和并输出
string s1,s2;
string s3;
getline(cin,s1);
getline(cin,s2);
int len1=s1.length();
int len2=s2.length();
int lenMax=len1>len2?len1:len2;
s3.resize(lenMax+1);
int temp1,temp2,temp3,temp4=0;
int i=len1-1;
int j=len2-1;
int k=lenMax;
while(i>=0||j>=0)
{
if(i>=0)
temp1=s1[i]-'0';
else
temp1=0;
if(j>=0)
temp2=s2[j]-'0';
else
temp2=0;
temp3=(temp1+temp2+temp4)%10; //本位
temp4=(temp1+temp2+temp4)/10; //进位
s3[k]=temp3+'0';
i--;
j--;
k--;
if(i<0&&j<0)
{
if(temp4!=0)
s3[k]=temp4+'0';
else
s3.erase(s3.begin());
break;
}
}
cout<<s3<<endl;
}
3.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。要求实现函数:
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int hash[26];
int main(int argc, _TCHAR* argv[])
{
string s;
string s2;
cin>>s;
int len=s.length();
int i=0;
while(i<len)
{
if(hash[s[i]]==0)
{
hash[s[i]]=1;
s2.push_back(s[i]);
}
else
i++;
}
cout<<s2<<endl;
return 0;
}
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int hash[26];
int main(int argc, _TCHAR* argv[])
{
string s;
string s2;
cin>>s;
int len=s.length();
int i=0;
while(i<len)
{
if(hash[s[i]]==0)
{
hash[s[i]]=1;
s2.push_back(s[i]);
}
else
i++;
}
cout<<s2<<endl;
return 0;
}
4.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
string s;
getline(cin,s);
int len=s.length();
string s1;
int i=0;
int sameNum=1;
char sTemp[100];
while(i<len)
{
sameNum=1;
while(i<len-1&&s[i]!=s[i+1])
{
s1.push_back(s[i]);
i++;
}
if(i==len-1)
{
s1.push_back(s[i]);
break;
}
while(s[i]==s[i+1]&&i<len-1)
{
sameNum++;
i++;
}
itoa(sameNum,sTemp,10);
s1.append(sTemp);
s1.push_back(s[i]);
i++;
}
cout<<s1<<endl;
return 0;
}
5.通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
string s;
getline(cin,s);
int pos1=s.find(" ");
int pos2=s.find(" ",pos1+1);
if(pos1==s.npos||pos2==s.npos)
{
cout<<0<<endl;
return 0;
}
string sNum1=s.substr(0,pos1);
string sNum2=s.substr(pos2+1);
string sOper=s.substr(pos1+1,1);
if(sOper!="+"&&sOper!="-")
{
cout<<0<<endl;
return 0;
}
int num1=atoi(sNum1.c_str());
int num2=atoi(sNum2.c_str());
if(sOper=="+")
cout<<num1+num2<<endl;
if(sOper=="-")
cout<<num1-num2<<endl;
return 0;
}
7..输入一串字符,只包含“0-10”和“,”找出其中最小的数字和最大的数字(可能不止一个),输出最后剩余数字个数。如 输入 “3,3,4,5,6,7,7”
#include "stdafx.h"
#include<iostream>
#include<sstream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
string s;
cin>>s;
int len=s.length();
for(int i=0;i<len;i++)
if(s[i]==',')
s[i]=' ';
stringstream strm(s);
vector<string> sv;
string temp;
while(strm>>temp)
sv.push_back(temp);
vector<int> si;
for(vector<string>::iterator iter=sv.begin();iter!=sv.end();iter++)
si.push_back(atoi((*iter).c_str()));
int min=si[0];
int max=min;
for(int i=0;i<si.size();i++)
{
if(min>si[i])
min=si[i];
if(max<si[i])
max=si[i];
}
cout<<min<<' '<<max<<endl;
for(int i=0;i<si.size();i++)
if(si[i]!=min&&si[i]!=max)
cout<<si[i]<<' ';
cout<<endl;
return 0;
}
9. 删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
char s[100],subS[100];
char sOut[100];
cin.getline(s,100);
cin.getline(subS,100);
int len=strlen(s);
int subLen=strlen(subS);
int i=0,j=0;
int k=0;
int count=0;
while(i<len)
{
while(j<subLen&&s[i+j]==subS[j])
j++;
if(j==subLen) //匹配成功
{
i=i+j;
count++;
}
else
{
sOut[k++]=s[i++];
}
j=0;
}
sOut[k]='\0';
cout<<sOut<<endl;
cout<<count<<endl;
return 0;
}
12. 描述:一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。注:电灯数和学生数一致。输入:电灯的数量
输出:亮着的电灯数量
样例输入:3
样例输出:1
#include "stdafx.h"
#include<iostream>
using namespace std;
int lamp[65536];
int main(int argc, _TCHAR* argv[])
{
int n;
cin>>n;
//方法,常规方法
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(j%i==0)
{
if(lamp[j]==1)
lamp[j]=0;
else
lamp[j]=1;
}
}
}
int count=0;
for(int i=1;i<=n;i++)
if(lamp[i]==1)
count++;
cout<<count<<endl;
/*方法2 热头同学想到的很高明的方法,只有灯的编号有奇数个因子的时候才会亮,
因子个数为奇数的数必然是某个数的平方,这种思路的代码很简单。
*/
count=0;
for(int i=1;i*i<=n;i++)
{
count++;
}
cout<<count<<endl;
return 0;
}
#include "stdafx.h"
#include<iostream>
using namespace std;
int lamp[65536];
int main(int argc, _TCHAR* argv[])
{
int n;
cin>>n;
//方法,常规方法
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(j%i==0)
{
if(lamp[j]==1)
lamp[j]=0;
else
lamp[j]=1;
}
}
}
int count=0;
for(int i=1;i<=n;i++)
if(lamp[i]==1)
count++;
cout<<count<<endl;
/*方法2 热头同学想到的很高明的方法,只有灯的编号有奇数个因子的时候才会亮,
因子个数为奇数的数必然是某个数的平方,这种思路的代码很简单。
*/
count=0;
for(int i=1;i*i<=n;i++)
{
count++;
}
cout<<count<<endl;
return 0;
}
14. 字串转换
问题描述:将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。例如:aa 转换为 bc,zz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
string s;
cin>>s;
int flag=0;
int len=s.length();
char reg=s[0]; //保存i-1改变之前的值
s[0]='a'+(s[0]-'a'+1)%26;
for(int i=1;i<len;i++)
{
if(s[i]==reg)
{
reg=s[i];
if(flag==0)
{
s[i]='a'+(s[i]-'a'+2)%26;
flag=1;
}
else
{
s[i]='a'+(s[i]-'a'+1)%26;
flag=0;
}
}
else
{
flag=0;
reg=s[i];
s[i]='a'+(s[i]-'a'+1)%26;
}
}
cout<<s<<endl;
}
19. 链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g
#include "stdafx.h"
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
/*
链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g
*/
struct ListNode
{
int data;
ListNode* next;
};
void printList(ListNode* head)
{
if(head==NULL)
return;
ListNode *p=head->next;
while(p!=NULL)
{
cout<<p->data<<' ';
p=p->next;
}
cout<<endl;
}
void deleteList(ListNode* head)
{
if(head==NULL)
return;
ListNode *q;
ListNode *p=head;
while(p!=NULL)
{
q=p->next;
delete p;
p=q;
}
}
int main(int argc, _TCHAR* argv[])
{
ListNode* head=new ListNode;
ListNode* p,*q;
const int n=11;
q=head;
for(int i=0;i<n;i++)
{
p=new ListNode;
p->data=i;
q->next=p;
q=p;
}
p->next=NULL;
//print original list
printList(head);
//相邻元素交换
p=head;
while(p->next!=NULL&&p->next->next!=NULL)
{
q=p->next; //交换
p->next=q->next;
q->next=p->next->next;
p->next->next=q;
p=p->next->next;
}
printList(head);
deleteList(head);
return 0;
}
20. 输入一串字符串,其中有普通的字符与括号组成(包括‘(’、‘)’、‘[’,']'),要求验证括号是否匹配,如果匹配则输出0、否则输出1.
#include "stdafx.h"
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
string s;
stack<char> st;
cin>>s;
int len=s.length();
int flag=0;
for(int i=0;i<len;i++)
{
switch(s[i])
{
case('('):
case('['):
st.push(s[i]);
break;
case(')'):
if(st.empty())
flag=1; //栈空,个数不匹配
else if(st.top()!='(') //顺序不对
{
flag=1;
}
else
st.pop();
break;
case(']'):
if(st.empty())
flag=1;
else if(st.top()!='[')
{
flag=1;
}
else
st.pop();
break;
}
}
if(flag==0&&st.empty())
cout<<1<<endl;
else
cout<<0<<endl;
return 0;
}
24.将整数倒序输出,剔除重复数据
输入一个整数,如12336544,或1750,然后从最后一位开始倒过来输出,最后如果是0,则不输出,输出的数字是不带重复数字的,所以上面的输出是456321和571。如果是负数,比如输入-175,输出-571。
#include "stdafx.h"
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
//将整数倒序输出,剔除重复数据
int main(int argc, _TCHAR* argv[])
{
char s[100];
cin>>s;
int len=strlen(s);
reverse(s,s+len);
int i=0;
while(s[i]=='0'&&i<len)
i++;
if(i==len)
return 0;
int j=0,k=i;
while(k<len-1)
{
if(s[k]!=s[k+1])
s[j++]=s[k++];
else
k++;
}
if(s[len-1]=='-')
{
s[j]='\0';
cout<<'-';
}
else
{
s[j++]=s[len-1];
s[j]='\0';
}
cout<<s<<endl;
return 0;
}
27.统计数字出现的次数,最大次数的统计出来
举例:输入:323324423343
输出:3,6
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
/*
27.统计数字出现的次数,最大次数的统计出来
举例:
输入:323324423343
输出:3,6
*/
int main(int argc, _TCHAR* argv[])
{
string s;
int hash[10];
cin>>s;
memset(hash,0,sizeof(hash));
int len=s.length();
int i=0;
while(i<len)
hash[s[i++]-'0']++;
int max=0;
for(int i=0;i<10;i++)
if(max<hash[i])
max=hash[i];
for(i=0;i<10;i++)
if(max==hash[i])
{
cout<<i;
i++;
break;
}
for(;i<10;i++)
if(max==hash[i])
cout<<','<<i;
cout<<endl;
return 0;
}
28.字符串首字母转换成大写
题目描述请编写一个main函数,它的功能是:将字符串中的所有单词的首字母改为大写,字符串中以空格分割各个单词,其他字符不变。
输入
一个字符串。
输出
所有单词的首字母改为大写的字符串。
样例输入
this is a Dog.
样例输出
This Is A Dog.
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
/*
28.字符串首字母转换成大写
题目描述
请编写一个main函数,它的功能是:将字符串中的所有单词的首字母改为大写,字符串中以空格分割各个单词,其他字符不变。
输入
一个字符串。
输出
所有单词的首字母改为大写的字符串。
样例输入
this is a Dog.
样例输出
This Is A Dog.
*/
int main(int argc, _TCHAR* argv[])
{
string s;
getline(cin,s);
bool isSpace=true;
int len=s.length();
for(int i=0;i<len;i++)
{
if(isSpace&&s[i]!=' ')
{
s[i]=toupper(s[i]);
isSpace=false;
}
if(s[i]==' ')
isSpace=true;
}
cout<<s<<endl;
return 0;
}
29. 子串分离
题目描述:通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。请编写一
个程序,自动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’并将子
串存储。
如果输入“abc def gh i d”,结果将是abc,def,gh,i,d,
#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
string s;
getline(cin,s);
vector<string> vs;
string temp;
int len=s.length();
bool isSpace=true;
for(int i=0;i<len;i++)
{
if(isSpace==true&&s[i]!=' ')
{
isSpace=false;
if(!temp.empty())
vs.push_back(temp);
temp.clear();
}
if(s[i]!=' ')
temp.push_back(s[i]);
if(s[i]==' ')
isSpace=true;
}
if(!temp.empty())
vs.push_back(temp);
for(vector<string>::iterator iter=vs.begin();iter!=vs.end();iter++)
cout<<*iter<<',';
cout<<endl;
return 0;
}
或者使用stringstream
#include "stdafx.h"
#include<iostream>
#include<string>
#include<sstream>
#include<vector>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
string s;
getline(cin,s);
stringstream sstr(s);
vector<string> vs;
string temp;
while(sstr>>temp)
vs.push_back(temp);
for(vector<string>::iterator iter=vs.begin();iter!=vs.end();iter++)
cout<<*iter<<',';
cout<<endl;
return 0;
}