L1-002. 打印沙漏 [图形打印]

问题描述
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“”,要求按下列格式打印
**



*

*
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;
符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例
19
输出样例:
**



*

*
2

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. using namespace std;
  5. int fun(int i){
  6. if(i == 1) return 1;
  7. else return fun(i-1) + 2 * (2 * i - 1);
  8. }
  9. int main(){
  10. int N;
  11. char c;
  12. cin>>N>>c;
  13. int row = 1;
  14. while(fun(row) <= N) row++; //递归得到上部分行数
  15. --row;
  16. vector<string> half;
  17. int t1,t2;
  18. for(int i = row;i >= 1;i--){ //打印上部分
  19. string t3;
  20. t1 = 2 * i - 1;
  21. t2 = row - i;
  22. while(t2--){
  23. cout<<' ';
  24. t3 += ' ';
  25. }
  26. while(t1--){
  27. cout<<c;
  28. t3 += c;
  29. }
  30. half.push_back(t3);
  31. cout<<endl;
  32. }
  33. for(int i = half.size() - 2; i>= 0; i--){ //打印下部分
  34. cout<<half[i];
  35. cout<<endl;
  36. }
  37. cout<<N - fun(row);
  38. return 0;
  39. }

L1-003. 个位数统计 [字符串处理]


问题描述**
就是统计字符串(仅数字0-9)的个数,最多1000位

  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. using namespace std;
  5. int main(){
  6. map<char, int> m;
  7. string s;
  8. cin>>s;
  9. int a[10] = {0};
  10. for(int i = 0;i < s.length();i++) a[s[i] - '0']++;
  11. for(int i = 0;i < 10;i++){
  12. if(a[i] != 0) cout<<i<<":"<<a[i]<<endl;
  13. }
  14. /*
  15. for(int i = 0;i < s.length();i++) m[s[i]]++;
  16. map<char, int>::iterator j;
  17. for(j = m.begin(); j != m.end(); j++){
  18. if(j->second != 0) cout<<j->first<<":"<<j->second<<endl;
  19. }*/
  20. return 0;
  21. }

笔记

  • 这道题也可以试试用map做

L1-005. 考试座位号 [查找元素] [vector结合结构体]

问题描述
查找元素
输入格式:
输入第一行给出一个正整数N(<=1000),随后N行,每行给出一个考生的信息:“准考证号试机座位号考试座位号”。其中准考证号由14位数字组成,座位从1到N编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。
考生信息之后,给出一个正整数M(<=N),随后一行中给出M个待查询的试机座位号码,以空格分隔。
输出格式:
对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用1个空格分隔。
输入样例:
4
1012015091223324
101201509121194 1
10120150912126 13
1012015091200232
2
34
输出样例:
101201509120022
10120150912119 1

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. struct stu{
  5. string id;
  6. int one; //试机号
  7. int two; //座位号
  8. };
  9. int main(){
  10. int N;
  11. cin>>N;
  12. vector<stu> v(N);
  13. for(int i = 0;i < N;i++){
  14. cin>>v[i].id>>v[i].one>>v[i].two;
  15. }
  16. int M,t;
  17. cin>>M;
  18. while(M--){
  19. cin>>t;
  20. for(int i = 0;i < N;i++){
  21. if(t == v[i].one) cout<<v[i].id<<' '<<v[i].two<<endl;
  22. }
  23. }
  24. return 0;
  25. }

L1-006. 连续因子 [逻辑题][逻辑对我基本初见杀][等于我没有逻辑]

问题描述:
一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3567,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数N(1输出格式:
首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1
因子2……因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内。
输入样例:
630
输出样例:
3
567

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. long int N,temp = 1;
  5. int main(){
  6. cin>>N;
  7. int len = 0,maxn = sqrt(N);
  8. int star = 1;
  9. for(int i = 2;i <= maxn;i++){
  10. int j;
  11. temp = 1;
  12. for(j = i;j <= maxn;j++){
  13. temp *= j;
  14. if(N % temp != 0) break;
  15. }
  16. if(j - i > len){
  17. len = j - i;
  18. star = i;
  19. }
  20. }
  21. cout<<len<<endl;
  22. for(int i = 0;i < len;i++){
  23. cout<<star + i;
  24. if(i != len - 1) cout<<'*';
  25. }
  26. return 0;
  27. }

笔记:

  • **体会代码的逻辑性与简洁性

L1-009. N个数求和

问题描述:

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数“分子/分母”的形式给出的,你输出的和也必须是有理数的形式。
输入格式:
输入第一行给出一个正整数N(<=100)。随后一行按格式“a1/b1 a2/b2 …”给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:
输出上述数字和的最简形式 —— 即将结果写成“整数部分 分数部分”,其中分数部分写成“分子/分母”,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1: 5 2/5 4/15 1/30 -2/60 8/3 输出样例1: 3 1/3 输入样例2: 2 4/3 2/3 输出样例2: 2 输入样例3: 3 1/3 -1/6 1/8 输出样例3: 7/24
```cpp

include

include

using namespace std;

typedef long long LL;

LL gcd(LL a, LL b) { return b == 0 ? a : gcd(b, a % b); } int main() { LL a, b, suma = 0, sumb = 1, temp; int n; cin >> n; for (int i = 0; i < n; i++) { cin >> a >> b; suma = suma b + a sumb; sumb = sumb * b;

  1. temp = (suma == 0 || sumb == 0) ? 1 : gcd(abs(suma), abs(sumb));
  2. suma = suma / temp;
  3. sumb = sumb / temp;
  4. }
  5. LL integer = suma / sumb; //整数小数分离
  6. suma = suma - integer * sumb;
  7. if(integer == 0){ //大小在0到-1的情况下 integer不能反映数值的正负
  8. if(suma > 0 && sumb < 0 || suma < 0 && sumb > 0) cout<<'-';
  9. }else{
  10. cout<<integer;
  11. if(suma != 0)
  12. cout << ' ';
  13. }
  14. if (suma != 0) {
  15. cout << abs(suma) << '/' << abs(sumb);
  16. }
  17. return 0;

}

  1. **笔记:**
  2. - 经典的分数相加题,归纳到大数+-*/一类
  3. <a name="afLoE"></a>
  4. ## L1-011. A-B [字符串处理]
  5. **问题描述:**<br />A-B问题<br />**输入样例:**<br />I love GPLT! Its a fun game!<br />aeiou<br />**输出样例:**<br />I lv GPLT! Its fn gm!
  6. ```cpp
  7. #include <iostream>
  8. #include <string>
  9. using namespace std;
  10. int main() {
  11. string a,b;
  12. getline(cin,a);
  13. getline(cin,b);
  14. int book[256] = {0};
  15. for(int i = 0;i < b.length();i++) book[b[i]] = 1;
  16. for(int i = 0;i < a.length();i++){
  17. if(book[a[i]] == 1) continue;
  18. cout<<a[i];
  19. }
  20. return 0;
  21. }

笔记

  • 经典A-B问题,ASCII码都在0-255之间

L1-013. 计算阶乘和 [水题]

问题描述:
计算 S = 1! + 2! + 3! + … + N!。

  1. #include <iostream>
  2. using namespace std;
  3. int fun(int n){
  4. if(n == 0 || n == 1) return n;
  5. else return n * fun(n - 1);
  6. }
  7. int main() {
  8. int n;
  9. cin>>n;
  10. int sum = 0;
  11. for(int i = 1;i <= n;i++){
  12. sum += fun(i);
  13. }
  14. cout<<sum;
  15. return 0;
  16. }