题目一:
[编程题] 字符串中找出连续最长的数字串 读入一个字符串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); } }