1.数字是否存在相同部分
求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。
函数为 int same(int num)
其中num是输入的整型数字
使用循环移位法。如,每次全扫描匹配一次。至外循环为length-2次。
12345678 12345678 12345678 12345678 12345678 12345678
78123456 67812345 56781234 45678123 34567812 23456781
int same( int num){
int data[100];
int length=0;
int count=0;
while(num>0)
{
data[length++]=num%10;
num/=10;
}
if(length<4)//至少四位
return 0;
for(int i=2;i<length;i++){//使用循环移位法,最开始移动两位
for(int j=0;j<length-i;j++){
if(data[i+j]==data[j]){
count++;
if(count>1)
return 1;
}
else
count=0;
}
for(int j=0;j<i;j++){
if(data[j]==data[length-i+j]){
count++;
if(count>1)
return 1;
}
else
count=0;
}
}
return 0;
}
2.识别字符串中的整数并转换为数字形式
问题描述:
识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数。
要求实现函数:
void take_num(const char *strIn, int *n, unsigned int *outArray)
【输入】 strIn: 输入的字符串
【输出】 n: 统计识别出来的整数个数
outArray:识别出来的整数值,其中outArray[0]是输入字符串中从左到右第一个整数,
outArray[1]是第二个整数,以此类推。数组地址已经分配,可以直接使用
【返回】无
注:
I、 不考虑字符串中出现的正负号(+, -),即所有转换结果为非负整数(包括0和正整数)
II、 不考虑转换后整数超出范围情况,即测试用例中可能出现的最大整数不会超过unsigned int可处理的范围
III、 需要考虑 '0' 开始的数字字符串情况,比如 "00035" ,应转换为整数35;
"000" 应转换为整数0;"00.0035" 应转换为整数0和35(忽略小数点:mmm.nnn当成两个数mmm和nnn来识别)
IV、 输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。
示例
输入:strIn = "ab00cd+123fght456-25 3.005fgh"
输出:n = 6
outArray = {0, 123, 456, 25, 3, 5}
int convert(const string& s,int* intArray){
if(s.empty())
return 0;
int i=0;
bool flag=false;
int j=0;
while(i<s.length()){
int temp=0;
while(isdigit(s[i])){
flag=true;
temp=temp*10+s[i]-'0';
i++;
}
if(flag){
intArray[j++]=temp;
temp=0;
flag=false;
}
i++;
}
return j;
}
int main()
{
string s;
getline(cin,s);
int* intArray=new int[s.length()/2+1];
memset(intArray,0,(s.length()/2+1)*sizeof(0));
int number=convert(s,intArray);
for(int i=0;i<number;i++)
cout<<intArray[i]<<endl;
}
3.计算字符串
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
示例
输入:“4 + 7” 输出:“11”
输入:“4 - 7” 输出:“-3”
输入:“9 ++ 7” 输出:“0” 注:格式错误
#include<iostream>
#include<string>
using namespace std;
/**********************solution1************************************/
bool getNum(const char*& p,int& result){//获得操作数,并返回下一个结果
if(!p||*p<'0'||*p>'9'){
return false;
}
else{
result=0;
while(*p>='0'&&*p<='9'){
result=*p-'0'+10*result;
p++;
}
}
return true;
}
int jisuan(const char* s){
if(!s||!isdigit(*s))
return 0;
int left=0,right=0;
bool flag=true;
bool flagOpt=true;
while(*s!='\0'){
if(flagOpt&&isdigit(*s)&&getNum(s,right)&&(*s==' '||*s=='\0')){//当且仅当,获取了运算符的情况下,当前是数字,且数字后紧跟” “或者结束标记位
if(flag)
left=left+right;
else
left=left-right;
flagOpt=false;//运算符已经使用,当前设置为未获取
if(*s==' ')
s++;
}
else if(!flagOpt&&*s=='+'&&*(s+1)==' '){//仅仅在运算符未被获取的情况下获取运算符
flag=true;//运算符为”+“
flagOpt=true;//运算符为”+“
s+=2;
}
else if(!flagOpt&&*s=='-'&&*(s+1)==' '){//仅仅在运算符未被获取的情况下获取运算符
flag=false;//运算符为”+“
flagOpt=true;//运算符为”+“
s+=2;
}
else
return 0;
}
return left;
}
void main(){
string s;
getline(cin,s);
cout<<jisuan(s.c_str())<<endl;
}
4.身高差值最小
要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高。
Smple input:161 189 167 172 188 Sample outPut: 188189
int cmp(const void* a,const void* b){
return *(int*)a- *(int*)b;
}
template<unsigned int N>
int choose(int (&data)[N]){
if(N<=1)
return -1;
qsort(data,N,sizeof(int),cmp);
int index=0;
int min=data[1]-data[0];
for(int i=1;i<N-1;i++){
if(data[i+1]-data[i]<=min){
index=i;
min=data[i+1]-data[i];
}
}
return index;
}
void main(){
int data[]={161,189,167,172,182,173};
int index=choose(data);
cout<<data[index]<<" "<<data[index+1]<<endl;
}
5.确定数字中有某个数字并排序
输入一行数字:123 423 5645 875 186523
在输入第二行:23
将第一行中含有第二行中“23”的数输出并排序
结果即:123 423 186523
solution:1
#include<iostream>
#include<vector>
#include <algorithm>
#include<string>
using namespace std;
/**********************solution1************************************/
int compare(const void * arg1, const void *arg2)
{
return (*(int*)arg1 - *(int*)arg2);
}
bool decision(int num,const string& key)
{
char* p=new char[10];
memset(p,0,10);
itoa(num,p,10);
string s(p);
if(s.find(key)!=string::npos)
return true;
else
return false;
}
void main(){
vector<int> vec;
int temp;
while(cin>>temp){
vec.push_back(temp);
if(cin.get()=='\n')
break;
}
string key;
getline(cin,key);
for(vector<int>::iterator iter=vec.begin();iter!=vec.end();){
if(!decision(*iter,key))
iter=vec.erase(iter);
else
iter++;
}
sort(vec.begin(),vec.end());
for(int i=0;i<vec.size()-1;i++)
cout<<vec[i]<<" ";
cout<<vec[vec.size()-1]<<endl;
}
solution 2:
#include<iostream>
#include<vector>
#include <algorithm>
#include<string>
using namespace std;
int compare(const void * arg1, const void *arg2)
{
return (*(int*)arg1 - *(int*)arg2);
}
vector<int> process(const string& str,const string& key){
string num;//存储读入的数据
vector<int> vec;
int i=0;
while(i<str.length()){
while(isdigit(str[i]))
num.push_back(str[i++]);
if(num.find(key)!=string::npos)
vec.push_back(atoi(num.c_str()));//调用函数将字符串转换为数字
num.clear();
i++;
}
sort(vec.begin(),vec.end());
return vec;
}
void main(){
string key,str;
getline(cin,str);
getline(cin,key);
vector<int> vec=process(str,key);
for(int i=0;i<vec.size()-1;i++)
cout<<vec[i]<<" ";
cout<<vec[vec.size()-1]<<endl;
}
重点是sort的使用方式。
6.输入整型数组求数组的最小数和最大数之和
输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50
int process(){
int temp;
cin>>temp;
int min,max;
min=max=temp;
char c=getchar();
while(c!='\n'){
cin>>temp;
if(temp>max)
max=temp;
else if(temp<min)
min=temp;
c=getchar();
}
return min+max;
}
7.数组中数字两两相同,有两个不同,找出这两个
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
int temp;
cin>>temp;
char ch=getchar();
while(ch!='\n'){
vec.push_back(temp);
cin>>temp;
ch=getchar();
}
vec.push_back(temp);
temp=0;
for(int i=0;i<vec.size();i++)
temp^=vec[i];
int index=1;
while(temp&index==0)
index=index<<1;
int num1=0,num2=0;
for(int i=0;i<vec.size();i++){
if(vec[i]&index)
num1^=vec[i];
else
num2^=vec[i];
}
cout<<num1<<","<<num2<<endl;
}
8.超过数组长度一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
int temp;
cin>>temp;
char ch=getchar();
while(ch!='\n'){
vec.push_back(temp);
cin>>temp;
ch=getchar();
}
vec.push_back(temp);
int i=1,j=1;
temp=vec[0];
while(i<vec.size()){
if(vec[i]==temp)
j++;
else if(j==1)
temp=vec[i];
else
j--;
i++;
}
cout<<temp<<endl;;
}
9.字符串首字母转换成大写
#include<iostream>
#include<string>
using namespace std;
void convert(string& s){
if(s.empty())
return;
int i=0;
while(i<s.length()){
if(isalpha(s[i])&&(i==0||s[i-1]==' '))
s[i]=toupper(s[i]);
i++;
}
}
int main()
{
string str;
getline(cin,str);
convert(str);
cout<<str<<endl;
return 0;
}