第一阶段:入门(20211125)
- 回归水题
- 2012 素数判定
- 2013 蟠桃记
- 2014 青年歌手大奖赛_评委会打分
- 2015 偶数求和(!)
- 2016 数据的交换输出(x)
- 2017 字符串统计
- 2018 母牛的故事
- 2019 数列有序!(类似插入排序)
- 2020 绝对值排序
- 2021 发工资咯:)
- 2022 海选女主角(!)
- 2023 求平均成绩
- 2024 C语言合法标识符(输入带空格的一行)
- 2025 查找最大元素
- 2026 首字母变大写
- 2027 统计元音
- 2028 最小公倍数(!20211210)
- 2029 反转字符串
- 2030 汉字统计(!)
- 2032 杨辉三角(!)
- 2040 亲和数
- 2042 老汉过路
- 2054 A == B ?(不是简单的比较)
- 2055 An easy problem
回归水题
2012 素数判定
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int x,y,z;
while(cin>>x>>y){
if(x==0 && y==0) break;
int temp=0; //记录非素数的个数
for(int n=x;n<=y;n++){
z=n*n+n+41;
//判断z是否为素数
for(int i=2;i*i<=z;i++){
if(z%i==0){
temp++;
break;
}
}
}
if(temp==0)
cout<<"OK"<<endl;
else
cout<<"Sorry"<<endl;
}
return 0;
}
2013 蟠桃记
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n,sum; //第n天
while(cin>>n){
sum=1;
//第n天剩1个
//第n-1天剩x=(1+1)*2个,因为 x/2-1=1
//第n-2天剩x=((1+1)*2+1)*2个,因为 x/2-1=(1+1*2)
for(int i=n;i>1;--i){ //i!=1
sum=(sum+1)*2;
}
cout<<sum<<endl;
}
return 0;
}
2014 青年歌手大奖赛_评委会打分
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n,sum;
int *a;
while(cin>>n){
a=new int[n];
for(int i=0;i<n;i++)
cin>>a[i];
//找到最高分和最低分
int m1=a[0],m2=a[0];
sum=a[0];
for(int i=1;i<n;i++){
if(a[i]<m1) m1=a[i];
if(a[i]>m2) m2=a[i];
sum+=a[i];
}
sum=sum-m1-m2;
printf("%.2f\n",sum*1.0/(n-2));
}
return 0;
}
2015 偶数求和(!)
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n,m; //n:数列的长度 m:每隔m个相加
while(cin>>n>>m){
int sum=0;
for(int i=1;i<=n;i++){
//处理n%m!=0的情况,即剩余不足m个的情况
if((n-i)<n%m && n%m!=0){ //
sum+=i*2;
if(i==n){
cout<<sum/(n%m)<<endl;
}
continue; //因为是最后几个不足m个的数相加,因此下面的代码不需要再执行
}
if(i%m!=0){
sum+=i*2;
}
else{
sum+=i*2;
if(i==n){
cout<<sum/m<<endl;
}
else{
cout<<sum/m<<" ";
}
sum=0;
}
}
}
return 0;
}
2016 数据的交换输出(x)
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n;
int *a;
while(cin>>n && n!=0){
a=new int[n];
cin>>a[0];
int j=0,min=a[0];
for(int i=1;i<n;i++){
cin>>a[i];
if(a[i]<min){
j=i; //temp是最小的下标
min=a[i]; //要把最小值重新赋给min!!!
}
}
if(j!=0){
int temp=a[0];
a[0]=a[j];
a[j]=temp;
}
for(int i=0;i<n-1;i++)
cout<<a[i]<<" ";
cout<<a[n-1]<<endl;
}
return 0;
}
2017 字符串统计
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n;
string s;
cin>>n;
for(int i=0;i<n;i++){
cin>>s;
int sum=0;
for(int j=0;j<s.size();j++){
if(s[j]>='0' && s[j]<='9'){
sum++;
}
}
cout<<sum<<endl;
}
return 0;
}
2018 母牛的故事
年 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
第一只母牛 | 1 | 1 | 1 | 1 | 1 | 1 |
第二年的牛 | 1 | - | - | - | 1 | 1 |
第三年的母牛 | 1 | - | - | - | 1 |
-
n<=4时,共n只
-
n=5时,共5+1只
-
n=6时,共6+2只(不对)
-
a[1]=1
-
a[2]=2
-
a[3]=3
-
a[4]=4
-
a[5]=6
-
a[6]=9
-
a[7]=
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n;
int a[60];
a[1]=1;
a[2]=2;
a[3]=3;
a[4]=4;
for(int i=5;i<55;i++){
a[i]=a[i-1]+a[i-3];
}
while(cin>>n && n!=0){
cout<<a[n]<<endl;
}
return 0;
}
2019 数列有序!(类似插入排序)
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n,m;
int *a;
while(cin>>n>>m){
if(n==0 && m==0){
break;
}
a=new int[n+1];
for(int i=0;i<n;i++){
cin>>a[i]; //n个有序的数列
}
int j;
for(j=n-1;j>=0;--j){
if(a[j]>m){
a[j+1]=a[j];
}
else break; //!!!
}
a[j+1]=m;
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<a[n]<<endl;
}
return 0;
}
2020 绝对值排序
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n,m;
int *a;
while(cin>>n && n!=0){
a=new int[n];
for(int i=0;i<n;i++)
cin>>a[i];
//冒泡排序
int flag=0; //没有交换则退出
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(abs(a[j])<abs(a[j+1])){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1;
}
}
if(flag==0) break;
}
for(int i=0;i<n-1;i++)
cout<<a[i]<<" ";
cout<<a[n-1]<<endl;
}
return 0;
}
2021 发工资咯:)
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
void sum_n(int &a,int size,int &sum){
if(a>=size){
sum+=a/size;
a=a-a/size*size;
}
}
int main(){
int n,a;
while(cin>>n && n!=0){
int sum=0;
for(int i=0;i<n;i++){
cin>>a;
//100元,50元,10元,5元,2元,1元
/*
if(a>100){
sum+=a/100;
a=a-a/100*100;
}
*/
sum_n(a,100,sum);
sum_n(a,50,sum);
sum_n(a,10,sum);
sum_n(a,5,sum);
sum_n(a,2,sum);
sum_n(a,1,sum);
}
cout<<sum<<endl;
}
return 0;
}
2022 海选女主角(!)
主要是行号和列号。。。
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n,m;
int *a;
while(cin>>n>>m){
a=new int[n*m];
cin>>a[0];
int max=abs(a[0]);
int x,y;
for(int i=1;i<n*m;i++){
cin>>a[i];
if(abs(a[i])>max){
max=abs(a[i]);
if(i<m){
x=0;
y=i;
}
else{
x=i/m; //行号
y=i-x*m; //列号
}
}
}
cout<<x+1<<" "<<y+1<<" "<<a[x*m+y]<<endl;
}
return 0;
}
下面这段代码没通过。。。
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n,m;
int **a;
while(cin>>n>>m){
a=new int* [n];
for(int i=0;i<m;i++)
a[i]=new int[m];
cin>>a[0][0];
int x=0,y=0;
int max=abs(a[0][0]);
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(i!=0 || j!=0){
cin>>a[i][j];
if(abs(a[i][j])>max){
max=abs(a[i][j]);
x=i+1; //行号
y=j+1; //列号
}
}
}
}
cout<<x<<" "<<y<<" "<<a[x-1][y-1]<<endl;
for(int i=0;i<m;i++)
delete []a[i];
}
return 0;
}
2023 求平均成绩
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n,m;
int a[50][5];
while(cin>>n>>m){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
//n个学生的平均成绩
int sum_s;
for(int i=0;i<n;i++){
sum_s=0;
for(int j=0;j<m;j++){
sum_s+=a[i][j];
}
printf("%.2f",sum_s*1.0/m);
if(i!=n-1)
printf(" ");
else
printf("\n");
}
float *aver_c=new float[m]; //!!!平均值应该是浮点数
//m门课的平均成绩
int sum_c;
for(int j=0;j<m;j++){
sum_c=0;
for(int i=0;i<n;i++)
sum_c+=a[i][j];
aver_c[j]=sum_c*1.0/n;
printf("%.2f",sum_c*1.0/n);
if(j!=m-1)
printf(" ");
else
printf("\n");
}
//各科成绩均大于等于平均成绩的学生数量
int sum=0,x=0;
for(int i=0;i<n;i++){
x=0;
for(int j=0;j<m;j++){
if(a[i][j]>=aver_c[j]) x++;
}
if(x==m) sum++;
}
cout<<sum<<endl<<endl;
}
return 0;
}
2024 C语言合法标识符(输入带空格的一行)
char c[50];
cin.getline(c,50);
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
bool isLetter(char c){
if((c>='A' && c<='Z') || (c>='a' && c<='z'))
return true;
return false;
}
/*c的合法标识符:
1.标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,
2.并且首字符不能是数字,
3.但可以是字母或者下划线
*/
int main(){
int n;
cin>>n;
char str[50];
getchar();
for(int j=0;j<n;j++){
//getchar();
cin.getline(str,50); 输入的字符串含有空格
if(isLetter(str[0]) || str[0]=='_'){
int sum=1;
for(int i=1;i<strlen(str);i++){
if(isLetter(str[i]) || (str[i]>='0' && str[i]<='9') || str[i]=='_')
sum++;
}
if(sum==strlen(str)) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
else cout<<"no"<<endl;
}
return 0;
}
string s;
getline(cin,s);
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
bool isLetter(char c){
if((c>='A' && c<='Z') || (c>='a' && c<='z'))
return true;
return false;
}
/*c的合法标识符:
1.标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,
2.并且首字符不能是数字,
3.但可以是字母或者下划线
*/
int main(){
int n;
cin>>n;
string str;
getchar();
for(int j=0;j<n;j++){
//getchar();
getline(cin,str); 输入的字符串含有空格
if(isLetter(str[0]) || str[0]=='_'){
int sum=1;
for(int i=1;i<str.size();i++){
if(isLetter(str[i]) || (str[i]>='0' && str[i]<='9') || str[i]=='_')
sum++;
}
if(sum==str.size()) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
else cout<<"no"<<endl;
}
return 0;
}
2025 查找最大元素
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
bool isLetter(char c){
if((c>='A' && c<='Z') || (c>='a' && c<='z'))
return true;
return false;
}
/*c的合法标识符:
1.标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,
2.并且首字符不能是数字,
3.但可以是字母或者下划线
*/
int main(){
string s;
while(cin>>s){ //由字母组成
//先找到最大值
char max=s[0];
for(int i=1;i<s.size();i++){
if(s[i]>max){
max=s[i];
}
}
for(int i=0;i<s.size();i++){
cout<<s[i];
if(s[i]==max)
cout<<"(max)";
}
cout<<endl;
}
return 0;
}
2026 首字母变大写
#include<ctype.h>
toupper(char c);
tolower(char c);
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
int main(){
string s;
while(getline(cin,s)){ //由字母组成
int temp=-1; //标记空格的位置
for(int i=0;i<s.size();i++){
if(s[i]==' ') temp=i;
else{ //不是空格,是空格的下一个
if(i==temp+1){
s[i]=toupper(s[i]);
}
}
}
cout<<s<<endl;
}
return 0;
}
自己写的转换大小写的方法
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
char toupper_0(char c){
if(c>='A' && c<='Z')
return c;
else //大小写asscii相差32
return c-32;
}
int main(){
string s;
while(getline(cin,s)){ //由字母组成
int temp=-1; //标记空格的位置
for(int i=0;i<s.size();i++){
if(s[i]==' ') temp=i;
else{ //不是空格,是空格的下一个
if(i==temp+1){
s[i]=toupper_0(s[i]);
}
}
}
cout<<s<<endl;
}
return 0;
}
2027 统计元音
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
int main(){
int n;
string s;
cin>>n;
getchar(); //!!!接收换行符!!!
for(int i=0;i<n;++i){
int sum[5]={0};
getline(cin,s);
for(int j=0;j<s.size();j++){
switch (s[j]){
case 'a':sum[0]++;break; //break;不能忘
case 'e':sum[1]++;break;
case 'i':sum[2]++;break;
case 'o':sum[3]++;break;
case 'u':sum[4]++;break;
}
}
cout<<"a:"<<sum[0]<<endl;
cout<<"e:"<<sum[1]<<endl;
cout<<"i:"<<sum[2]<<endl;
cout<<"o:"<<sum[3]<<endl;
cout<<"u:"<<sum[4]<<endl;
if(i!=n-1)
cout<<endl;
}
return 0;
}
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
int main(){
int n;
string s;
cin>>n;
getchar(); //!!!接收换行符!!!
char c[5]={'a','e','i','o','u'};
for(int i=0;i<n;++i){
int sum[5]={0};
getline(cin,s);
for(int j=0;j<s.size();j++){
switch (s[j]){
case 'a':sum[0]++;break;
case 'e':sum[1]++;break;
case 'i':sum[2]++;break;
case 'o':sum[3]++;break;
case 'u':sum[4]++;break;
}
}
for(int k=0;k<5;k++)
cout<<c[k]<<":"<<sum[k]<<endl;
if(i!=n-1)
cout<<endl;
}
return 0;
}
2028 最小公倍数(!20211210)
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
long long gcd(long long x,long long y){
//求x和y的最大公约数
if(x%y==0) return y;
return gcd(y,x%y);
}
int main(){
long long n,a,min;
while(cin>>n){
long long min=1;
for(long long i=0;i<n;i++){
cin>>a;
min=min*a/gcd(min,a); //最小公倍数=2数成绩/最大公约数
}
cout<<min<<endl;
}
return 0;
}
https://blog.csdn.net/weixin_42673018/article/details/100179764
2029 反转字符串
- 重新建个string存储反转的字符串
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
int main(){
int n;
string s;
cin>>n;
for(int i=0;i<n;++i){
cin>>s;
//string s1=new string[s.size()]; //错误
string s1=s;
for(int j=0;j<s.size();j++)
s1[j]=s1[s.size()-1-j];
if(s1==s)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}
- 收尾对应的相比较
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
int main(){
int n;
string s;
cin>>n;
for(int i=0;i<n;++i){
cin>>s;
int flag=1; //2个比较的字符不等时为0
for(int j=0;j<s.size()/2;j++){
if(s[j]!=s[s.size()-1-j]) flag=0;
}
if(flag==1)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}
2030 汉字统计(!)
https://blog.csdn.net/qq_42025235/article/details/105558042
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
int main(){
int n;
string s;
cin>>n;
getchar();
for(int i=0;i<n;++i){
getline(cin,s);
int sum=0;
for(int j=0;j<s.size();j++){
int a=s[j];
if(a>=0 && a<=127) sum++;
}
cout<<(s.size()-sum)/2<<endl;
}
return 0;
}
比较asscii码没能行
原来是又把j写成了i
但是汉字占2个字节,所以要除以2
20211210
2032 杨辉三角(!)
试图用一维数组,没成功。。。
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
int main(){
int n;
int a[50][50];
while(cin>>n){
for(int i=1;i<=n;i++){
//每层
for(int j=1;j<=i;j++){
if(j<=i-1 && j>1){ //如果不是头和尾
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
else
a[i][j]=1;
cout<<a[i][j];
if(j!=i)
cout<<" ";
else
cout<<endl;
}
}
cout<<endl;
}
return 0;
}
2040 亲和数
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
int sum_y(int n){ //计算1个数n的所有除他自身的约数之和
int sum=1;
for(int i=2;i*i<=n;i++){
if(n%i==0)
sum=sum+i+n/i;
}
return sum;
}
int main(){
int M,a,b;
cin>>M;
for(int i=0;i<M;++i){
cin>>a>>b;
if((sum_y(a)==b) && (sum_y(b)==a)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
2042 老汉过路
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
int main(){
int N,a;
cin>>N;
for(int i=0;i<N;++i){
int sum=3;
cin>>a;
while(a>0){
a--;
sum=(sum-1)*2;
}
cout<<sum<<endl;
}
return 0;
}
2054 A == B ?(不是简单的比较)
string的find
string.find(),当找不到时,会返回一个很大的数
使用int pos=n.find('.')
则查找失败会返回-1
https://blog.csdn.net/qq_38735931/article/details/82501503
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
string change(string n){
//处理数中有小数点的情况,如3.0000,那么此时比较3.0000与3,则应输出yes
int pos=n.find(".");
//cout<<"‘.’的位置"<<pos<<endl;
if(pos!=-1){
int i;
for(i=n.size()-1;i>pos && n[i]=='0';--i);
if(n[i]=='.')
n=n.substr(0,i); //截取0-'.'之前的,不要'.'
else
n=n.substr(0,i+1);
}
return n;
}
int main(){
string a,b;
while(cin>>a>>b){
string s1=change(a);
string s2=change(b);
if(s1==s2) cout<<"YES"<<endl; //if(change(a)==change(b))会只执行change(b)?
else cout<<"NO"<<endl;
}
return 0;
}
2055 An easy problem
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype> //toupper()转大写字母函数
using namespace std;
int main(){
int n,a,b;
char c;
cin>>n;
for(int i=0;i<n;i++){
cin>>c>>a;
if(c>='A' && c<='Z')
b=c-'A'+1;
else
b='a'-c-1;
cout<<a+b<<endl;
}
return 0;
}