2012:判断区域内的数是否全为素数
#include<iostream>
#include<math.h>
using namespace std;
//想要使用bool型的判定时要注意,返回值只有 0 和 非0 不太会使用的话建议使用整型返回值
int isprime(int n){
for(int j=2;j<n;j++)
if(n%j==0)
return 0;
return 1;
}
int main(){
int x,y,item;
while(cin>>x>>y){//无需判定x,y值的大小
if(x==0&&y==0)
break;
int s;
for(int i=x;i<=y;i++){
s=i*i+i+41;
if(isprime(s)==0)
{
cout<<"Sorry"<<endl;
break;
}
if(i==y){
cout<<"OK"<<endl;
}
}
}
return 0;
}
:2013:猴子吃桃子
#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
int s=1; // 第n天时剩下的,即 i=1 时,s 的值
for(int i=2;i<=n;i++){
s=(s+1)*2;
}
cout<<s<<endl;
}
return 0;
}
2014:求平均值
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
int n,temp;
while(cin>>n){
double s=0;
int *a=new int [n];
for(int i=0;i<n;i++)
cin>>a[i];
int m=n;
while(m>1){
for(int i=1;i<m;i++)
if(a[i-1]>a[i])
{
temp=a[i-1];
a[i-1]=a[i];
a[i]=temp;
}
m--;
}
for(int i=1;i<n-1;i++)
s+=a[i];
s=(double)s/(n-2);
cout<<fixed<<setprecision(2)<<s<<endl;
delete[]a;
}
}
2015:将数组划分区域,分别求各区域的平均值
#include<iostream>
using namespace std;
int main(){
int n,m;
while(cin>>n>>m){
int k=0,p;//p的作用是动态数组的容量
if(n%m!=0)//根据不同的n,m值,p的结果不同,此处需要注意
p=n/m+1;
else
p=n/m;
double s=0;
double *a=new double [p];
for(int i=1;i<=n;i++)
{
s+=i*2;
if(k==(p-1)&&i==n) //如果k为数组最后一个元素索引,且此时i*2的值被加入s中
a[k]=(double)s/(n%m);//对最后一个部分的值进行计算赋值
if(i%m==0)
{
a[k]=(double)s/m;
s=0;
k++;
}
}
for(int i=0;i<p;i++){
if(i==p-1)//最后一个元素的输出不能含有空格
cout<<a[i];
else
cout<<a[i]<<" ";
}
cout<<endl;
delete[]a;//动态数组内存释放
}
return 0;
}
2016:将数组最小的数与首元素交换
#include<iostream>
using namespace std;
//很简单本题就是寻找最小值,然后与第一个元素交换位置
int main(){
int n;
int temp;
while(cin>>n){
if(n==0)
break;
int *a=new int [n];
for(int i=0;i<n;i++)
cin>>a[i];
int min=0;
for(int i=1;i<n;i++)
if(a[min]>a[i])
min=i;
temp=a[min];
a[min]=a[0];
a[0]=temp;
for(int i=0;i<n;i++)
if(i<n-1)
cout<<a[i]<<" ";
else
cout<<a[i]<<endl;
}
return 0;
}
2017:统计数字字符出现的个数
#include<iostream>
#include<string.h>
using namespace std;
int main(){
int n;
cin>>n;
char c;
c=getchar();//读取n后面的换行
char p[1000];
while(n-->0){
gets(p);
int len=strlen(p);
int count=0;
for(int i=0;i<len;i++)
if(p[i]>='0'&&p[i]<='9')
count++;
cout<<count<<endl;
}
return 0;
}
2018:母牛真能生
#include<iostream>
using namespace std;
//这类题型通常通过列出前部分的数据,来选择合适的递归函数,
//自行对递归函数验算一部分就可以大致得出正确答案
int T(int n){
if(n<=4)
return n;
else
return T(n-1)+T(n-3);
}
int main(){
int n;
while(cin>>n){
if(n==0)
break;
cout<<T(n)<<endl;
}
return 0;
}
2019:任意数插入后由小到大的顺序不变
#include<iostream>
using namespace std;
int main(){
int n,m;
int temp;
while(cin>>n>>m){
if(n==0&&m==0)break;
int *a=new int [n+1];
for(int i=0;i<n;i++)
cin>>a[i];
int p=0;
for(int i=0;i<n;i++)
if(m<=a[i])
{
p=i;
break;//这里找到了第一个比m值大的数后一定要跳出循环,否则将会继续寻找下一个比m值大的数
}
if(m>a[n-1])
p=n;
for(int j=n-1;j>=p;j--)//逐个向后移位
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
a[p]=m;
for(int i=0;i<n+1;i++)
if(i==n)
cout<<a[i]<<endl;
else
cout<<a[i]<<" ";
delete[]a;
}
return 0;
}
2020:数组按绝对值的大小排序
#include<iostream>
using namespace std;
int main(){
int n;
int temp;
while(cin>>n){
int *a=new int [n];
for(int i=0;i<n;i++)
cin>>a[i];
int m=n;
while(m>1){//冒泡排序,
for(int j=1;j<m;j++)
//下面这一句的意思就是把数组元素的值换成正数后进行比较,但是并没有改变数组元素的值
if((a[j-1]>0?a[j-1]:(-a[j-1]))<(a[j]>0?a[j]:(-a[j])))
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
m--;
}
for(int i=0;i<n;i++)
if(i<n-1)
cout<<a[i]<<" ";
else
cout<<a[i]<<endl;
delete[]a;
}
return 0;
}
2021:不找零的发工资
本题最大的关键就在于工资优先以最大面额给予,求余100后改变工资(<100)再判断50,依次类推。
#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
if(n==0)break;
int count,s=0;
int *a=new int [n];
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
{
count=0;
while(a[i]>0)
if(a[i]/100!=0){
count+=a[i]/100;
a[i]=a[i]%100;
}
else if(a[i]/50!=0){
count+=a[i]/50;
a[i]=a[i]%50;
}
else if(a[i]/10!=0){
count+=a[i]/10;
a[i]=a[i]%10;
}
else if(a[i]/5!=0){
count+=a[i]/5;
a[i]=a[i]%5;
}
else if(a[i]/2!=0){
count+=a[i]/2;
a[i]=a[i]%2;
}else if(a[i]==1){
count++;
a[i]=0;
}
s+=count;
}
cout<<s<<endl;
s=0;
delete[]a;
}
return 0;
}
2022:求数组元素绝对值最大的数的位置
本题建议,提交语言时选择使用G++,否则会报编译错误
#include<iostream>
#include<math.h>
using namespace std;
int main(){
int m,n;
while(cin>>m>>n){
int s=m*n;
int *a=new int [s];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>a[i*n+j];
int max=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(fabs(a[max])<fabs(a[i*n+j]))
max=i*n+j;
cout<<max/n+1<<" "<<max%n+1<<" "<<a[max]<<endl;
delete[]a;
}
return 0;
}
2023:学生平均成绩和课程平均成绩
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
//n为行 m为列
int n,m;
while(cin>>n>>m){
double s;
int count=0;
double **a=new double*[n+1];//二维数组的动态创建方法,
//容量多一行一列用于存储相应的平均值
for(int i=0;i<n+1;i++)
a[i]=new double [m+1];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>a[i][j];
for(int i=0;i<n;i++)
{
s=0;
for(int j=0;j<m;j++)
s+=a[i][j];
a[i][m]=(double)s/m;
}
for(int j=0;j<m;j++)
{
s=0;
for(int i=0;i<n;i++)
s+=a[i][j];
a[n][j]=(double)s/n;
}
for(int i=0;i<n;i++)
if(i==n-1)
cout<<fixed<<setprecision(2)<<a[i][m]<<endl;
else
cout<<fixed<<setprecision(2)<<a[i][m]<<" ";
for(int j=0;j<m;j++)
if(j==m-1)
cout<<fixed<<setprecision(2)<<a[n][j]<<endl;
else
cout<<fixed<<setprecision(2)<<a[n][j]<<" ";
for(int i=0;i<n;i++)
{
int j;
for(j=0;j<m;j++)
if(a[i][j]<a[n][j])
break;
if(j==m)
count++;
}
cout<<count<<endl<<endl;//这里要注意题目中说的,每个实例后面需要有一个空行,也就是说输出人数后要有两个换行符,否则一直报演示错误
for(int i=0;i<n+1;i++)
delete[]a[i];
delete[]a;
}
return 0;
}
2024:合法标识符
本题如果C++提交显示编译错误,请选择G++在OJ上面提交
#include<iostream>
#include<string.h>
using namespace std;
int main(){
int n;
cin>>n;
cin.ignore();//读取n后面的换行符 即getchar()
while(n-->0){
string c;
getline(cin,c);//读取含空格的字符串
int i;
for(i=1;i<c.size();i++)
{
if(c[0]=='_'||c[0]==' '||(c[0]>='a'&&c[0]<='z')||(c[0]>='A'&&c[0]<='Z')){
}else
{
cout<<"no"<<endl;
break;
}
if(c[i]=='_'||(c[i]>='a'&&c[i]<='z')||(c[i]>='A'&&c[i]<='Z')||(c[i]>='0'&&c[i]<='9')){
}else
{
cout<<"no"<<endl;
break;
}
}
if(i==c.size())
cout<<"yes"<<endl;
}
return 0;
}
2025:最大的字母后面添加 字符串(max)
#include<iostream>
#include<string.h>
using namespace std;
int main(){
string s1;
while(getline(cin,s1)){
int max=0;
char ch[]="(max)";
for(int i=1;i<s1.size();i++)
if(s1[max]<s1[i])
max=i;
for(int i=0;i<s1.size();i++)
if(s1[i]==s1[max])
{
s1.insert(i+1,ch);
i=i+5;//最大值字母后面新添加的字符串不应该被进行循环判断,直接改变i的值跳过判断(max)
}
int i=0;
while(s1[i]!='\0')
cout<<s1[i++];
cout<<endl;
}
return 0;
}
2026:小写改大写
这题有手就行,除非你没手 -_-
#include<iostream>
#include<string.h>
using namespace std;
int main(){
string s;
while(getline(cin,s)){
s[0]-=32;
for(int i=0;i<s.size();i++)
if(s[i]==' ')
s[i+1]-=32;
cout<<s<<endl;
}
return 0;
}
2027:统计元音字母个数
#include<iostream>
#include<string.h>
using namespace std;
//本题难度主要在于格式控制,哈哈哈
int main(){
int n;
cin>>n;
cin.ignore();//getchar()
string s;
while(n>0){
getline(cin,s);
int num1=0,num2=0,num3=0,num4=0,num5=0;
for(int i=0;i<s.size();i++)
if(s[i]=='a')
num1++;else if(s[i]=='e')
num2++;else if(s[i]=='i')
num3++;else if(s[i]=='o')
num4++;else if(s[i]=='u')
num5++;
cout<<"a:"<<num1<<endl
<<"e:"<<num2<<endl
<<"i:"<<num3<<endl
<<"o:"<<num4<<endl
<<"u:"<<num5<<endl;
if(n!=1)
cout<<endl;
n--;
}
return 0;
}
2028:求n个数的最小公倍数
最小公倍数乘以最大公约数等于两数相乘
多个数的最小公倍数,可以先求前两个数的最小公倍数,再用这个最小公倍数与后一个数来求最小公倍数,再用这个新的最小公倍数与下一个新的数求最小公倍数,以此类推,得到最后的最小公倍数即为所求最小公倍数
这里有越界错误,应该先除后乘
#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
int *a=new int [n];
for(int i=0;i<n;i++)
cin>>a[i];
int i;
for(i=1;i<n;i++)
{
int n1,n2;
n1=a[i-1];n2=a[i];
int m;
int r=a[i-1]%a[i];
while(r!=0){
a[i-1]=a[i];
a[i]=r;
r=a[i-1]%a[i];
}
m=n1/a[i]*n2;//先除后乘
a[i]=m;
}
cout<<a[i-1]<<endl;
delete[]a;
}
return 0;
}
2029:回文串
#include<iostream>
#include<string.h>
using namespace std;
int main(){
int n;
cin>>n;
cin.ignore();
string s;
bool flag;
while(n>0){
flag=true;
getline(cin,s);
for(int i=0;i<s.size();i++)
if(s[i]!=s[s.size()-i-1])
{
flag=false;
break;
}
if(flag==true)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
n--;
}
return 0;
}
2030://汉字机内码,本题要点就是汉字由两个字符组成,统计小于零字符的个数再除以2就是汉字的个数
#include<iostream>
#include<string.h>
using namespace std;
int main(){
int n;
cin>>n;
cin.ignore();
string s;
while(n--){
int sum=0;
getline(cin,s);
for(int i=0;i<s.size();i++)
if(s[i]<0)
sum++;
cout<<sum/2<<endl;
}
return 0;
}