题目一:
[编程题] 字符串中找出连续最长的数字串
读入一个字符串str,输出字符串str中的连续最长的数字串
输入描述:
个测试输入包含1个测试用例,一个字符串str,长度不超过255。
输出描述:
在一行内输出str中里连续最长的数字串。
输入例子:
abcd12345ed125ss123456789
输出例子:
123456789
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int i=0, j;
int num1=0, num2=0;
int index1=0, index2=0;
char str[255];
char flag=0;
scanf("%s", str);
while(str[i] != '\0')
{
num2=0;
while(str[i]>='0' && str[i]<='9')
{
num2++;
index2 = i;
i++;
}
if(num2>num1)
{
num1 = num2;
index1 = index2;
}
i++;
}
for(j=index1-num1+1; j<=index1; j++)
cout << str[j];
cout << endl;
return 0;
}
题目二:
[编程题] n个数里最小的k个
读入一个字符串str,输出字符串str中的连续最长的数字串
输入描述:
每个测试输入包含空格分割的n+1个整数,最后一个整数为k值,n
不超过100。
输出描述:
输出n个整数里最小的k个数。升序输出
输入例子:
3 9 6 8 -10 7 -11 19 30 12 23 5
输出例子:
-11 -10 3 6 7
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int a[100] = {0};
int i=0, j=0;
int num=0;
while (scanf("%d",&a[num]) != EOF && getchar() != '\n')//录入带空格的数字流。
num++;
int n = num+1;
int k = a[num];
for(i=0; i<n-2; i++)//升序排序
{
for(j=n-2; j>i; j--)//因为升序,所以倒着
{
if(a[j-1] > a[j])
{
int temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
}
}
for(i=0; i<k-1; i++)
{
cout << a[i] << ' ';
}
cout << a[i] << endl;
return 0;
}
题目三:
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char a[100];
char b[100];
int i=0, j=0;
int n=0;
int l, r;
//scanf("%s", a);
gets(a);
while(a[i++] != '\0')
n++;
i=n-1;
//printf("%s\n", a);
for(i; i>=0; --i)
{
r = i;
while(a[i] != ' ' && i>=0)
{
i--;
}
l = i+1;
int num;
for(num=l; num <= r; num++)
{
b[j++] = a[num];
}
b[j++] = ' ';
}
b[j-1] = '\0';
printf("%s\n", b);
return 0;
}
题目四:
描述:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char a[100];
char b[100];
char c[100];
int i=0, j=0, k=0;
gets(a);
fflush;
gets(b);
//printf("%s\n", a);
//printf("%s\n", b);
while(a[i] != '\0')
{
j=0;
int flag = 1;
while(b[j] != '\0')
{
if(a[i] == b[j])
{
flag=0;
break;
}
j++;
}
if(flag==1)//如果a[i]没有在b中,则把a[i]存入c[k]中
c[k++]=a[i];
i++;
}
c[k]='\0';
printf("%s\n", c);
return 0;
}
题目五:
描述:输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来。
思路:
/*
0-1背包问题
1.首先判断,如果n>m,则n中大于m的数不可能参与组合,此时置n = m;
2.将最大数n加入且n == m,则满足条件,输出;
3.将n分两种情况求解:
(1)n没有加入,取n = n - 1; m = m;递归下去;
(2)n加入,取n = n - 1, m = m - n,递归下去。
*/
help1()函数是按照上述思路写的,help()函数则是从1开始取。
#include<iostream>
#include<vector>
using namespace std;
void help(int n, int m, vector<int>& v, int beg)
{
if (m == 0)//m==0,说明找到了几个数相加等于m
{
for (int i = 0; i<v.size(); i++)
{
i == 0 ? cout << v[i] : cout << " " << v[i];
}
cout << endl;
}
for (int i = beg; i <= n && i <= m; i++)
{
v.push_back(i);//取了i
help(n, m - i, v, i + 1);//从i+1开始查找
v.pop_back();
}
}
void help1(int n, int m, vector<int>& v)
{
if(m==0)
{
for(int i=v.size()-1; i>=0; --i)
{
i==v.size()-1 ? cout << v[i] : cout << " " << v[i];
}
cout << endl;
}
for(int i=n; i>0; --i)
{
v.push_back(i);//取n
help1(i-1, m-i, v);
v.pop_back();
}
}
int main()
{
int n, m;
while (cin >> n >> m)
{
vector<int> v;
help(n, m, v, 1);
}
}