求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子1,2,3,1+2+3=6,那么6是完数。即完数是等于其所有因子相加和的数。
测试数据有多组,输入n,n数据范围不大。
对于每组输入,请输出1-n内所有的完数。如有案例输出有多个数字,用空格隔开,输出最后不要有多余的空格。
方法:
根据题意直接写程序
6
6
#include <iostream> #include "vector" using namespace std; int printPerNum(int n); bool IsPerNum(const int m); int main() { int n = 0; while (cin >> n) { printPerNum(n); } return 0; } int printPerNum(int n) { for (int i = 1; i <= n;i++) { if (IsPerNum(i))//判断该数是否是完数 { if (i != 6)//控制空格的出现 { cout << " "; } cout << i;//若是就输出 } } cout << endl; return -1; } bool IsPerNum(const int m) { bool ans = false; vector<int> facArr(1086,0); int count = 0; for (int i = 1; i <= m / 2;i++)//求因子 { if (m % i == 0) { facArr[count] = i; count++; } } int sum = 0; for (unsigned int i = 0; i < count; i++) { sum = sum + facArr[i]; } if (sum == m) { ans = true; } facArr.clear(); return ans; } /************************************************************** Problem: 1050 User: EbowTang Language: C++ Result: Accepted Time:140 ms Memory:1520 kb ****************************************************************/
给定a和n,计算a+aa+aaa+a...a(n个a)的和。
测试数据有多组,输入a,n(1<=a<=9,1<=n<=100)。
对于每组输入,请输出结果。
1 10
1234567900
#include <iostream> #include "vector" using namespace std; int stepSum(vector<int> &sumArr,int a,int n); int main() { int n = 0, a = 0; while (cin >>a>>n) { if (a>9 || a<0 || n>100 || n < 0) { break; } vector<int> sumArr(n+1,0);//注意长度不能是n stepSum(sumArr,a,n); /*//不要用这种遍历方式 for (unsigned int i = n-1; i >= 0; --i) { cout << sumArr[i]; }*/ for (unsigned int i = 0; i < n+1; i++) { if (sumArr[n] == 0 && (n - i) == n)// 跳过sumArr[n]==0的情况 { continue; } cout << sumArr[n-i]; } cout << endl; sumArr.clear(); } return 0; } int stepSum(vector<int> &sumArr, int a, int n) { for (int i = 1; i <= n;i++)//此加法公式中有n个数 { for (int j = 0; j < i;j++) { sumArr[j] = sumArr[j] + a; } } for (int i = 0; i < n; i++)// 这里实现进位操作 { if (sumArr[i] >= 10) { sumArr[i+1] += sumArr[i] / 10;//让高位获得来自低位的进位值 sumArr[i] %= 10;//低位自裁,只保留当前数的个位即可,比如223,只保留3,22给高位 } } return -1; } /************************************************************** Problem: 1051 User: EbowTang Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。
测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。
对于每组输入,请输出结果。
2 1 3 0
-1
C++程序实现如下:
#include <iostream> #include <vector> #include <algorithm> using namespace std; int getPos(vector<int> &v,int x); int main() { int n; while (cin >> n) { vector<int> vIn(n);//创建n个空元素 for (int i = 0; i < n; ++i)//获取n个元素 { cin >> vIn[i]; } int x = 0; cin >> x; int pos = getPos(vIn,x); cout << pos << endl; } return 0; } int getPos(vector<int> &v,int x) { for (unsigned int i = 0; i < v.size();i++) { if (v[i]==x) { return i; } } return -1;//error } /************************************************************** Problem: 1052 User: EbowTang Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/
输入一个数n,然后输入n个数值各不相同,调换数组中最大和最小的两个数,然后输出。
测试数据有多组,输入n(1<=n<=20),接着输入n个数。
对于每组输入,输出交换后的结果。
2 1 3
3 1
#include <iostream> #include "vector" #include <algorithm> using namespace std; int main() { int n = 0; while (cin>>n) { if (n > 20 || n < 0) break; vector<int> v(n,0); for (int i = 0; i < n;i++) cin >> v[i]; int min = 99999999,max=0; int posMin = 0, posMax = 0; for (int i = 0; i < n;i++) { if (max < v[i]) { max = v[i];posMax = i; } if (min > v[i]) { min = v[i]; posMin = i; } } swap(v[posMin], v[posMax]); for (int i = 0; i < n; i++) { if (i == n - 1) cout << v[i]; else cout << v[i] << " "; } cout << endl; v.clear(); } return 0; } /************************************************************** Problem: 1053 User: EbowTang Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/
输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串。
测试数据有多组,输入字符串。
对于每组输入,输出处理后的结果。
方法:
排序的简单运用
bacd
abcd
输入一个字符串,长度小于等于200,然后将数组逆置输出。
测试数据有多组,每组输入一个字符串。
对于每组输入,请输出逆置后的结果。
方法:
利用string类,一瞬间就完成了
hdssg
gssdh
输入两个正整数,求其最大公约数。
测试数据有多组,每组输入两个正整数。
对于每组输入,请输出其最大公约数。
方法:
欧几里得算法
49 14
7
C++程序实现如下:
输入20个数,每个数都在1-10之间,求1-10中的众数(众数就是出现次数最多的数,如果存在一样多次数的众数,则输出权值较小的那一个)。
测试数据有多组,每组输入20个1-10之间的数。
对于每组输入,请输出1-10中的众数。
5 1 5 10 3 5 3 4 8 6 8 3 6 5 10 7 10 2 6 2
5
#include <iostream> #include "vector" #include "string" #include <algorithm> using namespace std; int main() { vector<int> v(20,0); while (true) { for (int i = 0; i < 20; i++) { cin >> v[i]; if (v[i]>10 || v[i] < 0) { break; } } vector<int> v1(10, 0);//统计出现次数 for (int i = 0; i < v.size();i++) { v1[v[i]-1]++; } int max = 0; int pos = 0; for (int i = 0; i < v1.size();i++) { if (max < v1[i]) { max = v1[i]; pos = i; } } cout << pos+1 << endl; } } /************************************************************** Problem: 1057 User: EbowTang Language: C++ Result: Output Limit Exceed ****************************************************************/
输入任意4个字符(如:abcd), 并按反序输出(如:dcba)
题目可能包含多组用例,每组用例占一行,包含4个任意的字符。
对于每组输入,请输出一行反序后的字符串。
具体可见样例。
Upin cvYj WJpw cXOA
nipU jYvc wpJW AOXc
#include<stdio.h> int main() { char t[5]; while(gets(t)) printf("%c%c%c%c\n",t[3],t[2],t[1],t[0]); } /************************************************************** Problem: 1058 User: EbowTang Language: C++ Result: Accepted Time:40 ms Memory:1020 kb ****************************************************************/
#include "string" #include <iostream> using namespace std; int main() { string str; while (cin >> str) { for (int i = str.length() - 1; i >= 0;i--) { cout << str[i]; } cout << endl; str.erase(); } return 0; } /************************************************************** Problem: 1058 User: EbowTang Language: C++ Result: Time Limit Exceed ****************************************************************/
设a、b、c均是0到9之间的数字,abc、bcc是两个三位数,且有:abc+bcc=532。求满足条件的所有a、b、c的值。
题目没有任何输入。
请输出所有满足题目条件的a、b、c的值。
a、b、c之间用空格隔开。
每个输出占一行。
方法:
简单穷举
#include <iostream> using namespace std; int main() { for (int a = 0; a <= 9;a++) { for (int b = 0; b <= 9;b++) { for (int c = 0; c <= 9;c++) { if ((a * 100 + b * 10 + c + b * 100 + c * 10 + c) == 532) { cout << a<<" " << b <<" "<< c << endl; } } } } return 0; } /************************************************************** Problem: 1059 User: EbowTang Language: C++ Result: Accepted Time:0 ms Memory:1516 kb ****************************************************************/
一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。
求出2到60之间所有“完数”和“盈数”。
题目没有任何输入。
输出2到60之间所有“完数”和“盈数”,并以如下形式输出:
E: e1 e2 e3 ......(ei为完数)
G: g1 g2 g3 ......(gi为盈数)
其中两个数之间要有空格,行尾不加空格。
#include "iostream" using namespace std; int main(void) { cout << "E:"; for (int i = 2; i <= 60;i++) { int sum = 0; for (int j = 1; j <= i / 2;j++) { if (i%j == 0) sum = sum + j; } if (sum == i) cout<<" "<< i; } cout << endl; cout << "G:"; for (int i = 2; i <= 60; i++) { int sum = 0; for (int j = 1; j <= i / 2; j++) { if (i%j == 0) sum = sum + j; } if (sum > i) cout<<" " << i; } cout << endl; return 0; } /************************************************************** Problem: 1060 User: EbowTang Language: C++ Result: Accepted Time:0 ms Memory:1516 kb ****************************************************************/
有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。
测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。
每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。
将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。
然后输出学生信息,按照如下格式:
姓名 年龄 成绩
3 abc 20 99 bcd 19 97 bed 20 97
bcd 19 97 bed 20 97 abc 20 99
学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。
#include "string" #include "vector" #include<algorithm> #include <iostream> using namespace std; typedef struct _StuInfo { int age; int score; string name; }StuInfo; bool cmpStu(StuInfo x, StuInfo y) { if (x.score != y.score) return x.score < y.score; else { if (x.name != y.name) return x.name<y.name; else return x.age<y.age; } } int main() { StuInfo a[10086]; int n; while (cin>>n)//人数 { //获取数据 for (int i = 0; i<n; i++) cin>> a[i].name >> a[i].age>> a[i].score; //多关键字排序 sort(a, a + n, cmpStu);//功能是先排分数,若相等则在其基础上对名字和年龄进行排序。 //输出信息 for (int i = 0; i<n; i++) cout<<a[i].name<<" "<< a[i].age<<" "<< a[i].score<<endl; } return 0; } /************************************************************** Problem: 1061 User: EbowTang Language: C++ Result: Accepted Time:800 ms Memory:1612 kb ****************************************************************/
编写程序,计算下列分段函数y=f(x)的值。
y=-x+2.5; 0<=x<2
y=2-1.5(x-3)(x-3); 2<=x<4
y=x/2-1.5; 4<=x<6
一个浮点数N
测试数据可能有多组,对于每一组数据,
输出N对应的分段函数值:f(N)。结果保留三位小数
1
1.500
#include <iomanip> //要用到格式控制符 #include<iostream> using namespace std; int main(void) { double x = 0.0, y = 0.0; while (cin >> x) { if (x >= 0 && x < 2) y = -x + 2.5; else if (x >= 2 && x < 4) y = 2 - 1.5*(x - 3)*(x - 3); else if (x >= 4 && x < 6) y = x / 2 - 1.5; else break; cout << fixed << setprecision(3) << y << endl;//控制精度并且输出 //fixed和setprecision合用就是控制小数点后三位,若果无fixed则控制的整个长度为3 } return 0; } /************************************************************** Problem: 1062 User: EbowTang Language: C++ Result: Accepted Time:40 ms Memory:1520 kb ****************************************************************/
编写程序,读入一个整数N。
若N为非负数,则计算N到2N之间的整数和;
若N为一个负数,则求2N到N之间的整数和
一个整数N,N的绝对值小于等于1000
测试数据可能有多组,对于每一组数据,
输出题目要求的值
1 -1
3 -3
#include <iostream> #include "vector" #include "string" #include <algorithm> #include "math.h" using namespace std; int main() { int n = 0; while (cin >> n) { if (abs(n)>1000) { break; } int sum; if (n>=0) { sum = 0; for (int i = n; i <= 2 * n;i++) { sum = sum + i; } cout << sum<<endl; } else { sum = 0; for (int i = -1 * n; i <= -1 * 2 * n; i++) { sum = sum + i; } cout << -1*sum << endl; } } } /************************************************************** Problem: 1063 User: EbowTang Language: C++ Result: Accepted Time:30 ms Memory:1520 kb ****************************************************************/
设N是一个四位数,它的9倍恰好是其反序数(例如:1234的反序数是4321)
求N的值
程序无任何输入数据
输出题目要求的四位数,如果结果有多组,则每组结果之间以回车隔开
方法:
简单穷举
#include <iostream> using namespace std; int getN(int i,int j,int k,int m); int getRN(int i,int j,int k,int m); int main() { for (int i = 1; i <= 9;i++) { for (int j = 0; j <= 9;j++) { for (int k = 0; k <= 9;k++) { for (int m = 0; m <= 9;m++) { int x = getN(i,j,k,m); int y = getRN(i,j,k,m); if (x * 9 == y) { cout << x << endl; } } } } } return 0; } int getN(int i, int j, int k, int m) { return i * 1000 + j * 100 + k * 10 + m; } int getRN(int i, int j, int k, int m) { return m * 1000 + k * 100 + j * 10 + i; } /************************************************************** Problem: 1064 User: EbowTang Language: C++ Result: Accepted Time:0 ms Memory:1516 kb ****************************************************************/
输入一个高度h,输出一个高为h,上底边为h的梯形。
一个整数h(1<=h<=1000)。
h所对应的梯形。
4
**** ****** ******** **********
梯形每行都是右对齐的,sample中是界面显示问题
#include<iostream> using namespace std; int main(void) { int h; while (cin >> h) { int i, j; for (i = 1; i <= h; i++)//输出h行 { for (j = 1; j <= 2 * h - 2 * i; j++)//控制每一行的空格数 cout<<" "; for (j = 2 * h - 2 * i + 1; j <= 3 * h - 2; j++)//控制每一行的星号数 cout<<"*"; cout << endl; } } return 0; } /************************************************************** Problem: 1065 User: EbowTang Language: C++ Result: Accepted Time:190 ms Memory:1520 kb ****************************************************************/
输入一个长度不超过20的字符串,对所输入的字符串,按照ASCII码的大小从小到大进行排序,请输出排序后的结果
一个字符串,其长度n<=20
输入样例可能有多组,对于每组测试样例,
dcba
abcd
#include <iostream> #include "string" #include <algorithm> using namespace std; int main() { string str; while (getline(cin,str)) { if (str.size()>20) break; sort(str.begin(), str.end()); for (int i = 0; i < str.size();i++) cout << str[i]; cout <<endl; } } /************************************************************** Problem: 1066 User: EbowTang Language: C++ Result: Time Limit Exceed ****************************************************************/
输入一个整数n,输出n的阶乘
一个整数n(1<=n<=20)
3
6
#include "iostream" #include "string" #include <string.h> #include <algorithm> using namespace std; int res[10010]; int main() { int n; while (cin>>n) { int i, j; memset(res, 0, sizeof(res));//全部置零 res[0] = 1;//f(0) res[1] = 1;//f(1) for (i = 2; i <= n; i++) { for (j = 1; j <= res[0]; j++) { res[j] = res[j] * i; } for (j = 1; j <= res[0]; j++) { if (res[j] >= 10) { res[j + 1] += res[j] / 10; res[j] %= 10; if (j == res[0]) { res[0]++; } } } } for (i = res[0]; i >= 1; i--) { cout << res[i]; } cout << endl; } return 0; } /************************************************************** Problem: 1067 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1556 kb ****************************************************************/
输入球的中心点和球上某一点的坐标,计算球的半径和体积
0 0 0 1 1 1
1.732 21.766
为避免精度问题,PI值请使用arccos(-1)。
#include<stdio.h> #include<stdlib.h> #include<math.h> int main() { double r,x0,y0,z0,x1,y1,z1; while(scanf("%lf%lf%lf%lf%lf%lf",&x0,&y0,&z0,&x1,&y1,&z1)!=-1) { r=sqrt(pow((x0-x1),2)+pow((y0-y1),2)+pow((z0-z1),2)); printf("%.3lf %.3lf\n",r,pow(r,3)*4*acos(-1)/3); } return 0; } /************************************************************** Problem: 1068 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1108 kb ****************************************************************/
输入N个学生的信息,然后进行查询。
输入的第一行为N,即学生的个数(N<=1000)
输出M行,每行包括一个对应于查询的学生的信息。
4 01 李江 男 21 02 刘唐 男 23 03 张军 男 19 04 王娜 女 19 5 02 03 01 04 03
02 刘唐 男 23 03 张军 男 19 01 李江 男 21 04 王娜 女 19 03 张军 男 19
#include "string" #include "vector" #include "stack" #include "iostream" using namespace std; typedef struct _StuInfo { string num; string name; string sex; int age; }StuInfo; int main(void) { int N = 0, M = 0; while (cin>>N)//有N位同学 { vector<StuInfo> stu(N); for (int i = 0; i < N;i++)//输入N个同学的具体信息 { cin >> stu[i].num >> stu[i].name >> stu[i].sex >> stu[i].age; } cin >> M;//M次查询 for (int i = 0; i < M;i++)//依次查询并输出结果 { string num; cin >> num;//输入学号 int j = 0; for (; j < N;j++) { if (stu[j].num == num)//找到这位学生 break; } if (j < N) cout << stu[j].num << " " << stu[j].name << " " << stu[j].sex << " " << stu[j].age << endl; else cout << "No Answer!" << endl; } } return 0; } /************************************************************** Problem: 1069 User: EbowTang Language: C++ Result: Accepted Time:140 ms Memory:1520 kb ****************************************************************/
输入年、月、日,计算该天是本年的第几天。
包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。
1990 9 20 2000 5 1
263 122
#include "iostream" using namespace std; int leap(int a) //自定义函数leap用来指定年份是否为闰年 { if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0)//闰年判定条件 return 1; //是闰年返回1 else return 0; //不是闰年返回0 } int number(int year, int m, int d) //自定义函数number计算输入日期为该年第几天 { int sum = 0, i; //数组a存放平年每月的天数 int a[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int b[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //数组b存放闰年每月的天数 if (leap(year) == 1) //判断是否为闰年 { for (i = 0; i < m - 1; i++) sum += b[i]; //是闰年,累加数组b前m-1个月份天数 } else { for (i = 0; i < m - 1; i++) sum += a[i]; //不是闰年,累加数组a钱m-1个月份天数 } sum += d; //将前面累加的结果加上日期,求出总天数 return sum; //将计算的天数返回 } int main() { int year, month, day, n; //定义变量为基本整型 while (cin >> year >> month >> day) { if (year > 3000 || year<1 || month>12 || month<1 || day>31 || day < 1) break; n = number(year, month, day); //调用函数number cout << n << endl; } return 0; } /************************************************************** Problem: 1070 User: EbowTang Language: C++ Result: Accepted Time:170 ms Memory:1520 kb ****************************************************************/
某人有8角的邮票5张,1元的邮票4张,1元8角的邮票6张,用这些邮票中的一张或若干张可以得到多少种不同的邮资?
题目没有任何输入
按题目的要求输出可以得到的不同邮资的数目
#include "vector" #include "iostream" #include <algorithm> using namespace std; int main() { int i, j, k, cnt = 0, tmp = 0, s = 0; vector<int> sum; for (i = 0; i <= 5; i++) for (j = 0; j <= 4; j++) for (k = 0; k <= 6; k++) sum.push_back(i * 8 + j * 10 + k * 18); sort(sum.begin(), sum.end()); for (i = 1; i < 6*5*7; i++) { if (sum[i] != sum[tmp])//tmp位置的所有元素互不同 { cnt++; tmp = i; } } cout << cnt << endl; return 0; } /************************************************************** Problem: 1072 User: EbowTang Language: C++ Result: Accepted Time:0 ms Memory:1516 kb ****************************************************************/
输入n值,使用递归函数,求杨辉三角形中各个位置上的值。
一个大于等于2的整型数n
题目可能有多组不同的测试数据,对于每组输入数据,
按题目的要求输出相应输入n的杨辉三角形。
6
1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
#include "iostream" using namespace std; int s[100][100] = { 0 };//存储杨辉数组 int getYanghui(int n, int i)//计算并获取杨辉行(具有n个数时)第i个数据 { if (i == 1 || n == 2 || n == i) return 1; else if (s[n][i] != 0) return s[n][i]; else return getYanghui(n - 1, i - 1) + getYanghui(n - 1, i); } int main() { int n; while (cin >> n) { for (int i = 2; i <= n; i++)//当前杨辉行的数字个数 { cout<<"1 "; for (int j = 2; j < i; j++)//杨辉行个数为i时需要计算i-2个杨辉数 { cout << getYanghui(i, j) << " "; s[i][j] = getYanghui(i, j); } cout <<"1"<< endl; } } return 0; } /************************************************************** Problem: 1073 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1556 kb ****************************************************************/
无任何输入数据
#include "iostream" using namespace std; int main() { int i, m, n; for (i = 0; i <= 256; i++) { n = i*i; m = 0; while (n) { m = m * 10 + n % 10;//122=1*100+2*10+2,但!=2*100+2*10+1,但是121可以 n = n / 10; } if (m == i*i) cout<<i<<endl; } return 0; } /************************************************************** Problem: 1074 User: EbowTang Language: C++ Result: Accepted Time:0 ms Memory:1516 kb ****************************************************************/
编写一个求斐波那契数列的递归函数,输入n值,使用该递归函数,输出如样例输出的斐波那契数列。
一个整型数n
题目可能有多组不同的测试数据,对于每组输入数据,
按题目的要求输出相应的斐波那契图形。
6
0 0 1 1 0 1 1 2 3 0 1 1 2 3 5 8 0 1 1 2 3 5 8 13 21 0 1 1 2 3 5 8 13 21 34 55
#include "vector" #include "iostream" using namespace std; int main(void) { int n=0; vector<int> vec(100,0); while (cin>>n) { cout << 0 << endl;//第一行 for (int i = 1; i < n;i++)//第二行到指定行的控制 { cout << 0 << " " << 1;//从第二行起每一行都有0 ,1 for (int j = 2; j < 2 * (i + 1)-1;j++)//输出每一行除去0,1后的接下来的数据 { vec[0] = 0; vec[1] = 1; vec[j] = vec[j - 1] + vec[j - 2]; cout << " " <<vec[j]; } cout << endl; } } return 0; } /************************************************************** Problem: 1075 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1520 kb ****************************************************************/
输入一个正整数N,输出N的阶乘。
正整数N(0<=N<=1000)
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
4 5 15
24 120 1307674368000
#include "iostream" #include "string" #include <string.h> #include <algorithm> using namespace std; int res[10010]; int main() { int n; while (cin>>n) { int i, j; memset(res, 0, sizeof(res));//全部置零 res[0] = 1;//f(0) res[1] = 1;//f(1) for (i = 2; i <= n; i++) { for (j = 1; j <= res[0]; j++) { res[j] = res[j] * i; } for (j = 1; j <= res[0]; j++) { if (res[j] >= 10) { res[j + 1] += res[j] / 10; res[j] %= 10; if (j == res[0]) { res[0]++; } } } } for (i = res[0]; i >= 1; i--) { cout << res[i]; } cout << endl; } return 0; } /************************************************************** Problem: 1076 User: EbowTang Language: C++ Result: Accepted Time:2010 ms Memory:1556 kb ****************************************************************/
给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。
对于S的所有非空连续子序列T,求最大的序列和。
变量条件:N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。
第一行为一个正整数N,第二行为N个整数,表示序列中的数。
输入可能包括多组数据,对于每一组输入数据,
仅输出一个数,表示最大序列和。
方法:
经典基础动态规划例子
寻找转移式子
5 1 5 -3 2 4 6 1 -2 3 4 -10 6 4 -3 -1 -2 -5
9 7 -1
#include "iostream" #include "vector" using namespace std; long long int getMax(long long int a, long long int b) { if (a > b) return a; else return b; } long long int getMaxSum(vector<long long int> &vec) { vector< long long int> tempSum(vec.size(), 0);//tempSum[i]只与vec[i]有关,非连续,非最大,非子段和.... tempSum[0] = vec[0]; vector<long long int> maxSum(vec.size(), 0);//maxSum[i]表示a[0]到a[i]的最大子段和值 maxSum[0]= vec[0];//当只有一元素时的最大连续子段和 long i = 1; for (; i < vec.size(); i++) {//状态转移//如果tempSum[i - 1] + vec[i]小,说明tempsum起副作用了(小于0了),重新以当前元素vec[i]开始累加 tempSum[i] = getMax(tempSum[i - 1] + vec[i], vec[i]); maxSum[i] = getMax(maxSum[i - 1], tempSum[i]);//更新a[0]到a[i]的最大子段和值 //maxSum[i] = getMax(maxSum[i - 1], getMax(tempSum[i - 1] + vec[i], vec[i])); } return maxSum[i-1]; } int main() { long long int n = 0; while (cin >> n) { vector< long long int> ivec(n, 0); for (long i = 0; i < n; i++) cin >> ivec[i]; long long int maxSum = getMaxSum(ivec); cout << maxSum << endl; } return 0; }
二叉树的前序、中序、后序遍历的定义:
前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
两个字符串,其长度n均小于等于26。
第一行为前序遍历,第二行为中序遍历。
二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。
输入样例可能有多组,对于每组测试样例,
输出一行,为后序遍历的字符串。
方法:
1,不使用建树的方法;
假设前序遍历为 adbgcefh, 中序遍历为 dgbaechf
前序遍历是先访问根节点,然后再访问子树的,而中序遍历则先访问左子树再访问根节点
那么把前序的 a 取出来,然后查找 a 在中序遍历中的位置就得到 dgb a echf
那么我们就知道 dgb 一定是二叉树的左子树,而 echf 是右子树, 显然在前序中相应的 dbg 是左子树 cefh 是右子树
然后继续根据这种规则根据前序遍历的“左子树”和后序遍历的“左子树”,推导出真正的左子树(未建树,并未真正这样操作),当对左子树遍历到只有一个节点时(这时前序遍历的与后序遍历的左子树是相同的哈),此时就可以打印了。然后就变成了一个递归的过程。
2,建树,然后后序遍历
ABC BAC FDXEAG XDEFAG
BCA XEDGAF
#include "string" #include "iostream" using namespace std; bool PreMidToBack(const string &prestr, const string &midstr) { if (prestr.size() == 0) return false; if (prestr.size() == 1) { cout << prestr; return true; } //在中序遍历中找到前序遍历的第一个节点的位置(就是当前根节点) int k = midstr.find(prestr[0]);//寻找字符c在字符串str中第一次出现的位置 //分别在前序和后序遍历中寻找原二叉树的左子树 string preLeft = prestr.substr(1, k); string midLeft = midstr.substr(0, k); PreMidToBack(preLeft, midLeft); //后序遍历:1.先后序遍历完左子树 //同理寻找右子树 string preRight = prestr.substr(k + 1, prestr.size() - k - 1); string midRight = midstr.substr(k + 1, midstr.size() - k - 1); PreMidToBack(preRight, midRight);//后序遍历:2.再后序遍历完右子树 //变成后序遍历要最后输出节点的值 cout << prestr[0];//后序遍历:3.最后访问根节点(注意:这个是整个二叉树的根) } int main() { string preStr, midStr; while (cin >> preStr >> midStr) { PreMidToBack(preStr, midStr); cout << endl; } } /************************************************************** Problem: 1078 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1520 kb ****************************************************************/
方法2:建二叉树的方法
#include <iostream> #include "string" using namespace std; //节点定义 class BSTNode { public: BSTNode(int ndata)//有参数的构造 {//函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面 pRight = NULL; pLeft = NULL; value = ndata; } friend class LinkBST;//允许链表类随意访问节点数据 private: char value; BSTNode *pRight; BSTNode *pLeft; }; // 带头结点的二叉树定义 class LinkBST { public: LinkBST(){} ~LinkBST(){} //后序遍历 void postOrder(BSTNode *pNode); //重建二叉树 void ReBuildBST(const string &preStr, const string &midStr, BSTNode *&proot); private: }; //Tips: //int *a;int * &p = a; //很容易理解,把 int * 看成一个类型,a就是一个整型指针,p 是a的别名,那么a与p就完全等同了 void LinkBST::ReBuildBST(const string &preStr, const string &midStr, BSTNode *&proot) {//注意:proot是引用,要不然函数返回会对proot的内容进行撤销 if (preStr.size() == 0) return; proot = new BSTNode(0); proot->value = preStr[0];//prestr[0]肯定是当前二叉树的根 proot->pLeft = NULL; proot->pRight = NULL; if (preStr.size() == 1) return; int k = midStr.find(preStr[0]);//找到字符出现的第一个位置 string preLeft = preStr.substr(1, k); string midLeft = midStr.substr(0, k); ReBuildBST(preLeft, midLeft, proot->pLeft); string preRight = preStr.substr(k + 1, preStr.size() - k - 1); string midRight = midStr.substr(k + 1, midStr.size() - k - 1); ReBuildBST(preRight, midRight, proot->pRight); } void LinkBST::postOrder(BSTNode *pNode) { if (pNode != NULL){ postOrder(pNode->pLeft); postOrder(pNode->pRight); cout << pNode->value; } } int main() { string preStr, midStr; while (cin >> preStr >> midStr) { BSTNode *pRoot = NULL; LinkBST bst; bst.ReBuildBST(preStr, midStr, pRoot); bst.postOrder(pRoot); cout << endl; } } /************************************************************** Problem: 1078 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1520 kb ****************************************************************/
一个长度不大于100的字符串,其中只有手机按键上有的小写字母
bob www
7 7
#include "string" #include<algorithm> #include <iostream> using namespace std; const string baseKeyPos = "11122233344455566667778888";//字母所在按键的位置 int cal(string s) { int len = s.length(); int ans = 0, prePos = 0, curPos; for (int i = 0; i<len; ++i) { curPos = baseKeyPos[s[i] - 'a'];//根据字母的相对位置比如‘b’为1,寻找其在键盘上的位置 if (curPos != prePos) ans += (s[i] - 'a') - baseKeyPos.find(curPos) + 1; else//连续两字符在同一个按键上,注意是连续 ans += 2 + (s[i] - 'a') - baseKeyPos.find(curPos) + 1; prePos = curPos;//记录上一次字母所在键盘位置 } return ans; } int main() { string s; while (cin >> s) cout << cal(s) << endl; return 0; } /************************************************************** Problem: 1079 User: EbowTang Language: C++ Result: Accepted Time:20 ms Memory:1520 kb ****************************************************************/
将M进制的数X转换为N进制的数输出。
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出X的N进制表示的数。
16 10 F
15
输入时字母部分为大写,输出时为小写,并且有大数据。
#include "string" #include "vector" #include <iostream> using namespace std; void convertHex(string &strk, int M, int N) { int i, k = 0; bool flag = false; vector<int> a(1000, 0); vector<int> b(1000, 0); for (i = 0; i < strk.size(); i++)//转换成数放在数组中,注意高位在第一位 { if (strk[i] <= '9' && strk[i] >= '0')//如果是数字 a[i] = strk[i] - '0'; else a[i] = strk[i] - 'A' + 10;//如果是大写字母 } while (true)//循环取余数 { for (i = 0; i < strk.size() - 1; i++) { if (a[i] != 0) { a[i + 1] += a[i] % N*M;//每位余数加到下一位 a[i] /= N; } } b[k++] = a[i] % N;//最后一位余数 a[i] /= N; flag = 0; for (i = 0; i < strk.size(); i++)//是否已除完 { if (a[i] != 0) flag = 1; } if (!flag) break; } for (i = k - 1; i >= 0; i--)//余数倒序输出即可 { if (b[i] >= 10) cout << char('a' + b[i] - 10); else cout << char('0' + b[i]); } cout << endl; } int main() { int M = 0, N = 0; string strk; while (cin>>M>>N) { if (M<2 || M>36 || N<2 || N>36) break; cin >> strk; convertHex(strk, M, N); } return 0; } /************************************************************** Problem: 1080 User: EbowTang Language: C++ Result: Accepted Time:60 ms Memory:1520 kb ****************************************************************/
给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。
输入包括5个整数:a0、a1、p、q、k。
第k个数a(k)对10000的模。
20 1 1 14 5
8359
#include "vector" #include "string" #include "iostream" using namespace std; int getRecursiveSequence(const vector<int> &vec); int main() { while (true) { vector<int> vec(5, 0); for (int i = 0; i < 5;i++) cin >> vec[i]; cout << getRecursiveSequence(vec) << endl; } return 0; } int getRecursiveSequence(const vector<int> &vec) { int a0 = vec[0]; int a1 = vec[1]; int an = 0; if (vec[4] == 0) return a0; if (vec[4] == 1) return a1; for (int i = 2; i <= vec[4];i++) { an = (vec[2] * a1 + vec[3] * a0)%10000; a0 = a1; a1 = an; } return an; } /************************************************************** Problem: 1081 User: EbowTang Language: C++ Result: Time Limit Exceed ****************************************************************/
写个算法,对2个小于1000000000的输入,求结果。
特殊乘法举例:123 * 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5
两个小于1000000000的数
输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。
123 45
54
#include <iostream> #include <cstdio> using namespace std; // 返回数字n的各个位数之和,如123,返回6 int Func(int n) { int ans = 0; while (n != 0) { ans += n % 10; n /= 10; } return ans; } int main() { int a, b; while (scanf("%d%d", &a, &b) != EOF) { int ans = Func(a) * Func(b); printf("%d\n", ans); } return 0; } /************************************************************** Problem: 1083 User: EbowTang Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/
一个整数总可以拆分为2的幂的和,例如:
7=1+2+4
7=1+2+2+2
7=1+1+1+4
7=1+1+1+2+2
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
总共有六种不同的拆分方式。
再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。
用f(n)表示n的不同拆分的种数,例如f(7)=6.
要求编写程序,读入n(不超过1000000),输出f(n)%1000000000。
每组输入包括一个整数:N(1<=N<=1000000)。
对于每组数据,输出f(n)%1000000000。
7
6
#include <iostream> using namespace std; int f[1000001] = { 0 };//增加一个 int fun(int n); //求解并返回 f(n) int main() { int n; while (cin >> n) cout << fun(n) << endl; return 0; } int fun(int n) //求解并返回 f(n) { f[0] = 1; f[1] = 1; for (int i = 2; i <= n; i++) { if (i % 2 ) //i能被2整除的话余数是0,反之不为0,即为真 f[i] = f[i - 1]; else f[i] = (f[i / 2] + f[i - 1]) % 1000000000; } return f[n]; } /************************************************************** Problem: 1084 User: EbowTang Language: C++ Result: Accepted Time:140 ms Memory:5424 kb ****************************************************************/
输入n个整数,依次输出每个数的约数的个数
输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
5 1 3 4 6 12
1 2 3 4 6
#include <cstdio> #include <cstdlib> #include "vector" #include "string" #include "algorithm" #include <iostream> #include "stack" #include <cmath> using namespace std; int getDivisor(int key); int main() { int n = 0; while (scanf("%d", &n) != EOF) { vector<int> vec(n, 0); //接受输入 for (int i = 0; i < n; i++) scanf("%d", &vec[i]); //获取每一个数的约数个数 for (int i = 0; i < n; i++) cout << getDivisor(vec[i]) << endl; } return 0; } //计算数key的约数 //方法:求key的约数个数的方法:将key开方得a, //判断a之前属于key的约数个数count。 //若key为某个整数的平方,则key约数个数为2*count-1,否则为2*count //参考: //http://baike.haosou.com/doc/5806281-6019081.html int getDivisor(int key) { /* int count = 1;//key本身算一个 for (int i = 1; i <= sqrt(key); i++) {//朴素的寻找方法 if (key % i == 0) count++; } return count; */ int count = 0; int a = sqrt(key); for (int i = 1; i <= a; i++) { if (key % i == 0) count++; } if (a*a != key) count = 2 * count; else count = 2 * count-1; return count; } /************************************************************** Problem: 1087 User: EbowTang Language: C++ Result: Accepted Time:150 ms Memory:1532 kb ****************************************************************/
12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转。
第一行一个正整数表示测试数据的个数n。
只有n行,每行两个正整数a和b(0<a,b<=10000)。
如果满足题目的要求输出a+b的值,否则输出NO。
2 12 34 99 1
46 NO
#include <iostream> using namespace std; int main() { int n, a, b, sum, tempa, tempb; while (cin>>n) { for (int i = 0; i < n; i++) { int ra = 0;//a的翻转 int rb = 0;//b的翻转 int rsum = 0;//a+b和的翻转 cin >> a >> b; tempa = a; tempb = b; //a的翻转 while (tempa) {//152的反转为例,2将会是最高位,所以累乘,每次取低位 ra = ra * 10 + tempa % 10; tempa = tempa / 10; } //b的翻转 while (tempb) { rb = rb * 10 + tempb % 10; tempb = tempb / 10; } sum = a + b; //a+b和的翻转 while (sum) { rsum = rsum * 10 + sum % 10; sum = sum / 10; } //两个数反转的和是否等于两个数的和的反转。 if (ra + rb == rsum) cout << a + b; else cout <<"NO"<< endl;; } } return 0; } /************************************************************** Problem: 1089 User: EbowTang Language: C++ Result: Wrong Answer ****************************************************************/
The Fibonacci Numbers{0,1,1,2,3,5,8,13,21,34,55...} are defined by the recurrence:
F0=0 F1=1 Fn=Fn-1+Fn-2,n>=2
Write a program to calculate the Fibonacci Numbers.
Each case contains a number n and you are expected to calculate Fn.(0<=n<=30) 。
For each case, print a number Fn on a separate line,which means the nth Fibonacci Number.
1
1
#include <iostream> using namespace std; int Fibonacci(int n); int main() { int n = 0; while (cin >> n) { int ans = 0; ans = Fibonacci(n); cout << ans<<endl; } } //传统递归将会很慢很慢,不可取 //int Fibonacci(int n) //{ // if (n < 0) // return -1; // if (n == 0 || n == 1) // return n; // return Fibonacci(n - 1) + Fibonacci(n - 2); //} //动态规划 int Fibonacci(int n) { int *A = new int[n+1]; A[0] = 0; A[1] = 1; for (int i = 2; i <= n;i++) A[i] = A[i - 1] + A[i - 2]; int ans = A[n]; delete[] A; A = NULL; return ans; } /************************************************************** Problem: 1092 User: EbowTang Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/
Finding all occurrences of a pattern in a text is a problem that arises frequently in text-editing programs.
Typically,the text is a document being edited,and the pattern searched for is a particular word supplied by the user.
We assume that the text is an array T[1..n] of length n and that the pattern is an array P[1..m] of length m<=n.We further assume that the elements of P and T are all alphabets(∑={a,b...,z}).The character arrays P and T are often called strings of characters.
We say that pattern P occurs with shift s in the text T if 0<=s<=n and T[s+1..s+m] = P[1..m](that is if T[s+j]=P[j],for 1<=j<=m).
If P occurs with shift s in T,then we call s a valid shift;otherwise,we calls a invalid shift.
Your task is to calculate the number of vald shifts for the given text T and p attern P.
For each case, there are two strings T and P on a line,separated by a single space.You may assume both the length of T and P will not exceed 10^6.
You should output a number on a separate line,which indicates the number of valid shifts for the given text T and pattern P.
abababab abab
3
#include <iomanip>//小数点精确 #include <cstdio> #include <cstdlib> #include "vector" #include "string" #include "algorithm" #include <iostream> #include "stack" #include "math.h" using namespace std; //计算模式P的部分匹配值,保存在next数组中 void MakeNext(const string &P, vector<int> &next) { int q, k;//k记录所有前缀的对称值 int m = P.size();//模式字符串的长度 next[0] = 0;//首字符的对称值肯定为0 for (q = 1, k = 0; q < m; ++q)//计算每一个位置的对称值 { //k总是用来记录上一个前缀的最大对称值 while (k > 0 && P[q] != P[k]) k = next[k - 1];//k将循环递减,值得注意的是next[k]<k总是成立 if (P[q] == P[k]) k++;//增加k的唯一方法 next[q] = k;//获取最终值 } } int KmpMatch(const string &T, const string &P, vector<int> &next) { int n = 0, m = 0, count = 0; n = T.size(); m = P.size(); MakeNext(P, next); for (int i = 0, q = 0; i < n; ++i) { while (q > 0 && P[q] != T[i]) q = next[q - 1]; if (P[q] == T[i]) q++; if (q == m) { q = next[q - 1];//寻找下一个匹配 count++; } } return count; } int main() { string T;//文本 string P;//待搜索字符串 vector<int> next(200, 0);//保存待搜索字符串的部分匹配表(所有前缀函数的对称值) while (cin >> T >> P) {//本题为kmp算法的简单应用 cout << KmpMatch(T, P, next) << endl; } return 0; } /************************************************************** Problem: 1094 User: EbowTang Language: C++ Result: Accepted Time:160 ms Memory:3052 kb ****************************************************************/
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
每组数据输出一行,即日期差值
20110412 20110422
11
#include "string" #include "vector" #include "stack" #include "math.h" #include <algorithm> #include "iostream" using namespace std; //数组a存放平年每月的天数 int a[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int b[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //数组b存放闰年每月的天数 //能被4整除且又能不能被100整除 是闰年 //能直接被400整除也是闰年 //闰年: //1.为了弥补人为的年份规定与地球实际绕日公转的时间差, //2.而人为把时间差补上了的年份,该年即为闰年. //增加闰日的原因 //现时的公历以回归年为“年”的计算基础,而一个回归年大约等于365.24220日。 //因为在平年公历只计算365日,结果四年后便会累积0.24220×4 = 0.9688日, //大约等于一日,所以便逢四年增加一日闰日以抵销这0.9688日。 int leap(int a) //自定义函数leap用来指定年份是否为闰年 { if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0)//闰年判定条件 return 366; //是闰年返回1 else return 365; //不是闰年返回0 } int number(int year, int m, int d) //自定义函数number计算输入日期为该年第几天 { int sum = 0, i; if (leap(year) == 366) //判断是否为闰年 { for (i = 0; i < m - 1; i++) sum += b[i]; //是闰年,累加数组b前m-1个月份天数 } else { for (i = 0; i < m - 1; i++) sum += a[i]; //不是闰年,累加数组a钱m-1个月份天数 } sum += d; //将前面累加的结果加上日期,求出总天数 return sum; //将计算的天数返回 } void getymd(string &str,int &y,int &m,int &d) { for (int i = 0; i < 4;i++) { y = y * 10; y = y + str[i] - '0'; } for (int i = 4; i < 6; i++) { m = m * 10; m = m + str[i] - '0'; } for (int i = 6; i < 8; i++) { d = d * 10; d = d + str[i] - '0'; } } int main() { while (true) { int year1 = 0, month1 = 0, day1 = 0, n1=0; //定义变量为基本整型 int year2 = 0, month2 = 0, day2 = 0, n2=0; string str; cin >> str; getymd(str, year1, month1, day1); if (month1 > 12 || day1 > 31) exit(1); n1 = number(year1, month1, day1); //调用函数number得到第一年的 str.erase(); cin >> str; getymd(str, year2, month2, day2); if (month2 > 12 || day2 > 31) exit(1); n2 = number(year2, month2, day2); //调用函数number int sumyear = 0; if (year2>year1) { while (year2 > year1) sumyear = sumyear + leap(year1++); cout << abs(sumyear - n1 + n2)+1 << endl; } else { while (year1 > year2) sumyear = sumyear + leap(year2++); cout << abs(sumyear - n2 + n1) +1<< endl; } } return 0; } /************************************************************** Problem: 1096 User: EbowTang Language: C++ Result: Output Limit Exceed ****************************************************************/
存在两组数组,和4个数字a,b,c,d,要求做如下操作,将第一个数组第a个数到第b个数,第二个数组的第c个数到第d个数放到一个数组中,求出合并后数组的中间值,如果有两个中间值,取下标较小的那个。
第一行一个整数t表示有t个测试数据
第二行两个整数,表示两个数组的长度,
接下来两行表示两个数字的值,
最后一行有四个整数a,b,c,d。
数组长度不会超过1000000。
每行一个整数,对应合并数组的下标在中间的那个值。
1 5 4 1 2 3 4 5 6 7 8 9 1 2 1 3
6
#include "vector" #include "math.h" #include<algorithm> #include <iostream> using namespace std; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { int aLen, bLen; int a, b, c, d; int npos = 0; cin >> aLen >> bLen; vector<int> avec(aLen), bvec(bLen); //获取数据 for (int j = 0; j<aLen; j++) cin >> avec[j]; for (int j = 0; j<bLen; j++) cin >> bvec[j]; cin >> a >> b >> c >> d; vector<int> mergevec(b+d-a-c+2); //合并数据 for (int j = a; j <= b; j++) mergevec[npos++] = avec[j - 1]; for (int j = c; j <= d; j++) mergevec[npos++] = bvec[j - 1]; cout << mergevec[(npos - 1) / 2] << endl; } return 0; } /************************************************************** Problem: 1097 User: EbowTang Language: C++ Result: Accepted Time:110 ms Memory:1720 kb ****************************************************************/
输入一行字符串,计算其中A-Z大写字母出现的次数
案例可能有多组,每个案例输入为一行字符串。
对每个案例按A-Z的顺序输出其中大写字母出现的次数。
DFJEIWFNQLEF0395823048+_+JDLSFJDLSJFKK
A:0 B:0 C:0 D:3 E:2 F:5 G:0 H:0 I:1 J:4 K:2 L:3 M:0 N:1 O:0 P:0 Q:1 R:0 S:2 T:0 U:0 V:0 W:1 X:0 Y:0 Z:0
#include <iostream> #include "string" #include "vector" using namespace std; bool countChar(const string &src, vector<int> &countTime); int main() { string str; while (cin>>str) { if (str.length() > 1000 || str.length() < 1) break; vector<int> countTime(26, 0); countChar(str,countTime); char a = 'A'; for (int i = 0; i < 26;i++) { cout << a << ":" << countTime[i] << endl; a++; } str.erase(); } return 0; } bool countChar(const string &src, vector<int> &countTime) { if (src.length() == 0) return false; for (unsigned int i = 0; i < src.size();i++) { if (src[i] >= 'A' && src[i] <= 'Z') { int pos = src[i] - 'A'; countTime[pos]++; } } return true; } /************************************************************** Problem: 1098 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1520 kb ****************************************************************/
对于一个字符串,将其后缀子串进行排序,例如grain
其子串有:
grain
rain
ain
in
n
然后对各子串按字典顺序排序,即:
ain,grain,in,n,rain
每个案例为一行字符串。
将子串排序输出
grain
ain grain in n rain
#include "string" #include <iostream> using namespace std; int main() { string str; while (cin>>str) { int len = str.size(); int pos = 0; int *visited=new int[len]; int i = 0; while (i<len)//共寻找len次最小子串 { string minsub(1000,'z');//设定近似最大子串(至少你的测试串均小于次字符串) pos = i; //寻找最小子串 for (size_t j = 0; j < len; j++) { string stepsub(str, j, len - j); if ( visited[j] != 1 && minsub > stepsub) { minsub = stepsub; pos = j; } } visited[pos] = 1; cout << minsub << endl; i++; } } return 0; } /************************************************************** Problem: 1099 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1520 kb ****************************************************************/