1002 写出这个数 (20 分)
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^100
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
PS: 自然数n的类型,因为数值可能会很大,所以这里使用字符串来记录输入,之后读取每一个字符与字符0相减求和。
PS: char *p[10] = {“ling”,“yi”,“er”,“san”,“si”,“wu”,“liu”,“qi”,“ba”,“jiu”};
#include <bits/stdc++.h>
using namespace std;
int main(){
int sum;
char *p[10] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string n;
cin >> n;
for (int i = 0; i < n.length(); i++){
sum += n[i] - '0';
}
int r[100], j=0;
while(sum != 0){
r[j++] = sum % 10;
sum /= 10;
}
for(j--; j>=0; j--){
cout << p[r[j]];
if(j != 0){
cout << " ";
}else{
cout << endl;
}
}
return 0;
}
1004 成绩排名 (20 分)
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
… … …
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112
#include<bits/stdc++.h>
using namespace std;
struct Student{
string name,no;
int score;
};
int main(){
int n;
cin >> n;
Student stu[n];
for(int i = 0; i < n; i++){
cin >> stu[i].name >> stu[i].no >> stu[i].score;
}
int max=stu[0].score, min=stu[0].score;
int m1=0, m2=0;
for(int i=1; i<n; i++){
if(max < stu[i].score){
max = stu[i].score;
m1 = i;
}
}
cout << stu[m1].name << " " << stu[m1].no << endl;
for(int i=1; i<n; i++){
if(min > stu[i].score){
min = stu[i].score;
m2 = i;
}
}
cout << stu[m2].name << " " << stu[m2].no << endl;
return 0;
}
1013 数素数 (20 分)
令 Pi表示第 i 个素数。现任给两个正整数 M≤N≤10^4,请输出 PM到PN的所有素数。
输入格式:
输入在一行中给出 M 和 N,其间以空格分隔。
输出格式:
输出从 PM到 PN的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。
输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
法a
先计数找素数,计到第m个就结束,另起一个函数进行输出
#include<bits/stdc++.h>
using namespace std;
//判断素数
int isPrim(int a){
for(int i = 2; i <= sqrt(a); i++){
if(a % i == 0){
return 0;
}
}
return 1;
}
int main(){
int m, n;
cin >> m >> n;
int num = 0;
int i = 2;
int cnt = 0;
while(1){
if(isPrim(i))
num++;
if(num == m)
// 到第m个,开始要输出了
break;
i++;
}
while(num <= n){
if(isPrim(i)){
cout << i;
num++;
cnt++;
if(cnt!=10 && num <= n)
//注意num多1
cout << " ";
else{
cout << endl;
cnt = 0;
}
}
i++;
}
return 0;
}
法b(格式错了)
将素数存到数组中,以空间换时间
#include<bits/stdc++.h>
using namespace std;
//判断素数
int fun(int a){
int k = 0;
for(int i = 2; i <= sqrt(a); i++){
if(a % i == 0){
k = 1;
break;
}
}
return k;
}
int main(){
int m, n;
cin >> m >> n;
int *a = new int[n+1];
int i = 1; //数组下标
int j = 2; //遍历数
while(i<=n){
if(fun(j) == 0){
//是素数
a[i++] = j;
}
j++;
}
for(int i = m; i <= n; i++){
cout << a[i];
if((i-m+1)%10 == 0)
cout << endl;
else
cout << " ";
}
if((n-m+1)%10 != 0)
cout <<endl;
return 0;
}
法c 埃氏筛法 筛选素数
将素数存到数组中,以空间换时间
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000001;
int prime[maxn]; //素数列表
int num = 0; //第几个
bool p[maxn] = {0};
void Find(int n){
for(int i = 2; i < maxn; i++){
//一个个找,那最小的那个肯定是素数,无需判断
if(p[i] == 0){
prime[num++] = i;
if(num >= n)
break;
for(int j=i+i; j<maxn; j+=i)
p[j]=1;
}
}
}
int main(){
int M, N;
cin >> M >> N;
Find(N);
int cnt = 0;
for(int i = M; i <= N; i++){
cout << prime[i-1];
cnt++;
if(cnt!=10 && i<N)
cout << " ";
else{
cout << endl;
cnt = 0;
}
}
return 0;
}
1016 部分A+B (15 分)
正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA组成的新整数 PA。例如:给定 A=3862767,DA =6,则 A 的“6 部分”PA 是 66,因为 A 中有 2 个 6。
现给定 A、DA、B、DB,请编写程序计算 PA+PB。
输入格式:
输入在一行中依次给出 A、DA 、B、DB,中间以空格分隔,其中 0<A,B<10^10。
输出格式:
在一行中输出 PA+PB的值。
输入样例 1:
3862767 6 13530293 3
输出样例 1:
399
输入样例 2:
3862767 1 13530293 8
输出样例 2:
0
PS: s1.find(s2) 在s1中找s2,并返回位置
PS: int 转化为字符 char ta = ‘0’ + da;
#include<bits/stdc++.h>
using namespace std;
int main(){
string sa, sb;
int da, db;
int pa = 0,pb = 0;
cin >> sa >> da >> sb >> db;
// 转化为字符
char ta = '0' + da;
char tb = '0' + db;
while(sa.find(ta) != -1){
// 不停的找ta
sa[sa.find(ta)] = '!';
pa = pa * 10 + da;
}
while(sb.find(tb) != -1){
sb[sb.find(tb)] = '!';
pb = pb * 10 + db;
}
cout << pa + pb << endl;
return 0;
}
1021 个位数统计 (15 分)
给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0(0≤di≤9, i=0,⋯,k−1, k−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。
输入样例:
100311
输出样例:
0:2
1:3
3:1
#include<bits/stdc++.h>
using namespace std;
int num[10]; //全局,自动填0
int main(){
string n;
cin >> n;
// int num[10] = {0};
for (int i = 0; i < n.length(); i++){
num[n[i] - '0']++;
}
for(int i = 0; i<10; i++){
if(num[i] != 0){
cout << i << ":" << num[i] << endl;
}
}
}
1027 打印沙漏 (20 分)
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
画图题 找规律
#include<bits/stdc++.h>
using namespace std;
int main(){
int N;
char c;
cin >> N >> c;
// 找单个有几行
int num = 0, k=0;
while(num <= N){
k++;
if(k==1){
num += 1;
}else{
num += 2 * (2 * k -1);
}
//cout <<num << " "<< k << endl;
}
// num和k都是多了一次
if(k==1){
num -= 1;
}else{
num -= 2 * (2 * k -1);
}
k -= 1;
//输出
for(int i=k; i>0; i--){
for(int j=1; j<=k-i; j++){
cout << " ";
}
for(int j=1; j<=2*i-1; j++){
cout << c;
}
cout << endl;
}
for(int i=2; i<=k; i++){
for(int j=1; j<=k-i; j++){
cout << " ";
}
for(int j=1; j<=2*i-1; j++){
cout << c;
}
cout << endl;
}
cout << N-num << endl;
return 0;
}