L1-002. 打印沙漏 [图形打印]
问题描述
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“”,要求按下列格式打印
**
*
*
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;
符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19
输出样例:
**
*
*
2
#include <iostream>#include <vector>#include <string>using namespace std;int fun(int i){if(i == 1) return 1;else return fun(i-1) + 2 * (2 * i - 1);}int main(){int N;char c;cin>>N>>c;int row = 1;while(fun(row) <= N) row++; //递归得到上部分行数--row;vector<string> half;int t1,t2;for(int i = row;i >= 1;i--){ //打印上部分string t3;t1 = 2 * i - 1;t2 = row - i;while(t2--){cout<<' ';t3 += ' ';}while(t1--){cout<<c;t3 += c;}half.push_back(t3);cout<<endl;}for(int i = half.size() - 2; i>= 0; i--){ //打印下部分cout<<half[i];cout<<endl;}cout<<N - fun(row);return 0;}
L1-003. 个位数统计 [字符串处理]
问题描述**
就是统计字符串(仅数字0-9)的个数,最多1000位
#include <iostream>#include <map>#include <string>using namespace std;int main(){map<char, int> m;string s;cin>>s;int a[10] = {0};for(int i = 0;i < s.length();i++) a[s[i] - '0']++;for(int i = 0;i < 10;i++){if(a[i] != 0) cout<<i<<":"<<a[i]<<endl;}/*for(int i = 0;i < s.length();i++) m[s[i]]++;map<char, int>::iterator j;for(j = m.begin(); j != m.end(); j++){if(j->second != 0) cout<<j->first<<":"<<j->second<<endl;}*/return 0;}
笔记:
- 这道题也可以试试用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
#include <iostream>#include <vector>using namespace std;struct stu{string id;int one; //试机号int two; //座位号};int main(){int N;cin>>N;vector<stu> v(N);for(int i = 0;i < N;i++){cin>>v[i].id>>v[i].one>>v[i].two;}int M,t;cin>>M;while(M--){cin>>t;for(int i = 0;i < N;i++){if(t == v[i].one) cout<<v[i].id<<' '<<v[i].two<<endl;}}return 0;}
L1-006. 连续因子 [逻辑题][逻辑对我基本初见杀][等于我没有逻辑]
问题描述:
一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3567,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数N(1
首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1
输入样例:
630
输出样例:
3
567
#include <iostream>#include <cmath>using namespace std;long int N,temp = 1;int main(){cin>>N;int len = 0,maxn = sqrt(N);int star = 1;for(int i = 2;i <= maxn;i++){int j;temp = 1;for(j = i;j <= maxn;j++){temp *= j;if(N % temp != 0) break;}if(j - i > len){len = j - i;star = i;}}cout<<len<<endl;for(int i = 0;i < len;i++){cout<<star + i;if(i != len - 1) cout<<'*';}return 0;}
笔记:
- **体会代码的逻辑性与简洁性
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;
temp = (suma == 0 || sumb == 0) ? 1 : gcd(abs(suma), abs(sumb));suma = suma / temp;sumb = sumb / temp;}LL integer = suma / sumb; //整数小数分离suma = suma - integer * sumb;if(integer == 0){ //大小在0到-1的情况下 integer不能反映数值的正负if(suma > 0 && sumb < 0 || suma < 0 && sumb > 0) cout<<'-';}else{cout<<integer;if(suma != 0)cout << ' ';}if (suma != 0) {cout << abs(suma) << '/' << abs(sumb);}return 0;
}
**笔记:**- 经典的分数相加题,归纳到大数+-*/一类<a name="afLoE"></a>## L1-011. A-B [字符串处理]**问题描述:**<br />A-B问题<br />**输入样例:**<br />I love GPLT! It’s a fun game!<br />aeiou<br />**输出样例:**<br />I lv GPLT! It’s fn gm!```cpp#include <iostream>#include <string>using namespace std;int main() {string a,b;getline(cin,a);getline(cin,b);int book[256] = {0};for(int i = 0;i < b.length();i++) book[b[i]] = 1;for(int i = 0;i < a.length();i++){if(book[a[i]] == 1) continue;cout<<a[i];}return 0;}
笔记:
- 经典A-B问题,ASCII码都在0-255之间
L1-013. 计算阶乘和 [水题]
问题描述:
计算 S = 1! + 2! + 3! + … + N!。
#include <iostream>using namespace std;int fun(int n){if(n == 0 || n == 1) return n;else return n * fun(n - 1);}int main() {int n;cin>>n;int sum = 0;for(int i = 1;i <= n;i++){sum += fun(i);}cout<<sum;return 0;}
