T1 抗疫凯旋
输入格式:
若干行字符串。每行一个字符串,表示抗议英雄名字的拼音,长度不超过20个字符。
该题需要用到如何判断输入文件的结束。如果每次读一个整数,一直读到文件结尾,可以利用下面的示例:
int a;
while (scanf("%d", &a) != EOF)
{
}
输出格式:
当前名单中共有多少位抗疫英雄。
输入样例:
Wang Yaoping
Zhu Shengyong
Cu Zidong
Zhou Zheng
输出样例:
4
十分基础的一道题,附上代码
#include<iostream>
int cnt;
using namespace std;
int main(void){
cout.tie(0);
cin.tie(0);
ios::sync_with_stdio(false);
char ch;
while((ch = getchar()) != EOF)
{
if(ch == '\n')
cnt ++;
}
cout << cnt;
return 0;
}
T2 求10个点到原点的距离和
求10个点到原点的距离和。输入10个点的坐标,计算并输出这些点到原点的距离和。定义函数dist(x, y),计算平面上任意一点(x, y)到原点(0, 0)的距离,函数返回值类型是double。
输入格式:
输入在一行中给出10对实数,每对实数对应一个点的横坐标和纵坐标。
输出格式:
在一行中按照“distance = S”的格式输出部分和的值S,精确到小数点后六位,请注意等号的左右各有一个空格。题目保证计算结果不超过双精度范围。
输入样例:
0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9
输出样例:
distance = 63.639610
附上代码:
#include<iomanip>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
int cnt;
double dis[15];
using namespace std;
int main(void){
cout.tie(0);
cin.tie(0);
ios::sync_with_stdio(false);
double sum;
int a[15][3];
for(int i = 1; i<= 10; i ++)
{
for(int j = 1; j <= 2; j ++)
{
cin >> a[i][j];
}
dis[i] = sqrt(pow(a[i][1],2) + pow(a[i][2],2));
sum += dis[i];
};
cout << fixed << setprecision(6) << "distance = " << sum << endl;
return 0;
}
T3 最小公倍数
3 最小公倍数
输入一对正整数x和y。
输入格式:
处理到文件结束
输入一对正整数x和y,输出二者的最小公倍数。
输出格式:
输出x,y的最小公倍数
输入样例:
1 3
15 20
输出样例:
3
60
显然,这也是一道基础题目
下面是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int a, b;
int gcd;
while(cin >> a >> b)
{
if( a< b) swap(a, b);
int lcm = a * b;
int t = 0;
while(b != 0)
{
t = a % b;
a = b;
b = t;
}
gcd = a;
lcm = lcm / gcd;
cout << lcm << '\n';
}
return 0;
}
T4 变量有多少字节?
C/C++语言中,表示整数和浮点数有好多种数据类型。在32位平台中,每种类型在内存中占用的字节数各不相同:
char: 1 Byte
int: 4 Byte
long: 4 Byte
long long: 8 Byte
__int128: 16 Byte (前面两个下划线'_',此类型仅在C++支持,但不影响本题求解)
float: 4 Byte
double: 8 Byte
long double: 16 Byte
一个字节对应8位二进制数,这也决定了他们能表达数值的范围是有差异的。现在给你一些数据类型的查询,请输出其对应的字节数。
建议大家使用函数进行模块化编程,例如:
int getByteofType(char t[])
{
}
int main()
{
}
输入格式:
第一行一个整数N(1<=N<=1000),表示待查询的类型的数量。以下N行,每行给出一种类型。
输出格式:
每行一个整数,表示输入中类型对应的字节数。
输入样例:
6
char
long long
char
int
long
__int128
输出样例:
在这里给出相应的输出。例如:
1
8
1
4
4
16
主要思路在于如何判别两个字符串是否相等,故想到strcmp,对相等的字符串,返回值为0,利用这一点和题中提示,可得如下代码:
#include<stdio.h>
#include<string.h>
void getByteofType(char ch[])
{
if(strcmp(ch,"char")==0)
printf("1");
if(strcmp(ch,"int")==0)
printf("4");
if(strcmp(ch,"long")==0)
printf("4");
if(strcmp(ch,"long long")==0)
printf("8");
if(strcmp(ch,"__int128")==0)
printf("16");
if(strcmp(ch,"float")==0)
printf("4");
if(strcmp(ch,"double")==0)
printf("8");
if(strcmp(ch,"long double")==0)
printf("16");
}
int main()
{
int n;
char ch[100];
scanf("%d", &n);
getchar();
for(int i = 0; i < n; i++)
{
gets(ch);
getByteofType(ch);
printf("\n");
}
return 0;
}
T5 斐波那契数列
输入格式:
一行,正整数N,(1<N<=1000000)
输出格式:
N位于第几项,如果不存在于数列中,输出-1
输入样例:
样例输入1:
2
样例输入2:
8
输出样例:
样例输出1:
3
样例输出2:
6
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int main(void)
{
int fib[32];
memset(fib, 0, sizeof(fib));
int i = 0;
while(i ++ <= 32)
{
if( i == 1 || i == 2)
{
fib[i] = 1;
}
if(i >= 3)
{
fib[i] = fib[i-1] + fib[i-2];
}
//cout << i << " " << fib[i] << '\n';
}
int n;
cin >> n;
for(int j = 1; j<= 31; j ++)
{
if(fib[j] == n)
{
cout << j;
return 0;
}
}
cout << "-1" ;
return 0;
}
T6 逆序实现输出
本题目要求读入1个正整数n,然后编写递归函数reverse(int n)实现将该正整数逆序输出。
输入格式:
输入在一行中给出1个正整数n。
输出格式:
对每一组输入,在一行中输出n的逆序数。
输入样例:
12345
输出样例:
54321
这里使用c++是十分简洁和优美的:
#include<iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<cstring>
#define ll long long
#define ull unsigned long long
using namespace std;
int main(void){
string a;
cin >> a;
int len = (int)a.size();
for (int i = len - 1; i >= 0; i --){
cout << a[i];
}
return 0;
}
T7 河南抗疫英雄
给出一系列抗疫英雄的姓名和来自的省份,现在请你帮忙统计来自河南的抗疫英雄有多少位。
注:建议大家使用函数进行模块化编程,例如:
bool judge(char name[], char province[]) //判断一个人员是否来自河南省
{
}
int main()
{
}
输入格式:
第一行一个整数N(1<=N<=100000),表示名单中共有多少人员。
以下N行中,每一行两个字符串用空格隔开,name province(name和province中均不包含空格,每个字符串长度都不超过20),分别表示姓名和省份的英文简称(这里我们明确河南省的代码固定为“HA”,其他省份代码我们不做要求,只要不是“HA”这个代码,我们就认为是其他省份);
输出格式:
一个数,表示来自河南省的人员有多少位。
输入样例:
在这里给出一组输入。例如:
3
aaa HA
bbb HK
qwe TW
输出样例:
在这里给出相应的输出。例如:
1
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int cnt;
int main(void)
{
int n;
string name, province;
cin >> n;
for(int i = 1 ; i <= n; i ++)
{
cin >> name >> province;
if(province == "HA")
{
cnt ++;
}
}
cout << cnt;
}
8.出生年
以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y
年,直到x
岁才遇到n
个数字都不相同的年份”这句话。
输入格式:
输入在一行中给出出生年份y
和目标年份中不同数字的个数n
,其中y
在[1, 3000]之间,n
可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。
输出格式:
根据输入,输出x
和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n
个数字都不相同”是指不同的数字正好是n
个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。
输入样例1:
1988 4
输出样例1:
25 2013
输入样例2:
1 2
输出样例2:
0 0001
附上代码:
请查看注释:
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
using namespace std;
bool vis[15];
int main(void)
{ int y, n;
int sum;
cin >> y >> n;
for(int i = y; i <= 4000; i ++)
{
memset(vis, 0, sizeof(vis));//每次将其初始化为全负
sum = 0;//每次更新sum
for(int j = 1; j <= 1000; j *= 10)
{
if(!vis[(i/j) % 10])// i这里是年份,j相当于去位符,每次循环一次,就去掉一位
{
vis[(i/j) % 10] = 1;//标记这个数字,如1988, 为 1,9,8被标记
sum += vis[(i/j) % 10];//被标记的个数,及不同数字的个数
}
}
if(sum == n) // 被标记的个数和题目要求相同
{
cout << i - y << " " << setw(4) << setfill('0') << i << endl; //c++ yyds 使用setfill和setw使标准4位和0填充
return 0;
}
}
return 0;
}
T9 汉诺塔
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void hanoi(int n, char a[], char b[], char c[])
{
if (n == 0) return;
if (n == 1)
{
cout << a << "->" << c << '\n';
}
else
{
hanoi(n-1, a, c, b);
cout << a << "->" << c << '\n';
hanoi(n-1, b, a, c);
}
}
int main()
{
int n;
cin >> n;;
char a[20], b[20], c[20];
cin >> a >> b >> c;
hanoi(n, a, b, c);
return 0;
}
T10
素因子分解
将单独发一篇文章介绍