第一套
L
题目概述:判断倒序后的字符串是否和原字符串相同。
思路:将原字符串赋值给另一个变量,运用函数倒序,然后判断两变量是否相等。
原码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int n,i;
string s,t;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>s;
t=s;
reverse(t.begin(),t.end());
if(t==s)cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
细节处理:非自定义函数的运用,char和string的运用。
P
题目概述:求A的B次方的最后三位表示的整数。
思路:循环相乘取余。
原码:
#include<cmath>
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
int main()
{
int a,b,i,ans;
cin>>a>>b;
while(a!=0||b!=0){
ans=1;
for(i=1;i<=b;i++){
ans=ans*a%1000;
}
cout<<ans<<endl;
cin>>a>>b;
}
return 0;
}
细节处理:平方过大时会超出限定范围,所以边相乘边取余。
U
题目概述:多组输入测试数据,输出6+手机号码后五位。
思路:将其看作输入一组字符数组,输出“6”,然后循环输出后五位。
原码:#include<iostream>
using namespace std;
char a[15];
int main()
{
int i,j,N;
cin>>N;
for(i=1;i<=N;i++)
{
for(j=1;j<=11;j++)
{
cin>>a[j];
}
cout<<'6';
for(j=7;j<=11;j++)
{
cout<<a[j];
}
cout<<endl;
}
return 0;
}
细节处理:11位手机号码,不能看作整数直接输入。
斐波那契数列
H(类似)
题目概述:一头母牛每年年初生一头小母牛,每头小母牛从第四个年头开始,每
年年初也生一头小母牛,求第n年的时候,共有多少头母牛。
思路:列举前面几年每年新生的小牛,找规律,第i年新生的小牛数等于第1年
到第i-3年新生小牛数量之和。最后循环相加n年新生小牛数。
原码:
#include<iostream>
using namespace std;
int a[60];
int main()
{
int n,i,j,sum;
a[4]=1;a[3]=1;a[2]=1;a[1]=1;
while(cin>>n,!(n==0))
{
for(i=5;i<=n;i++)
{
a[i]=0;
for(j=i-3;j>=1;j--)
{
a[i]=a[i]+a[j];
}
}
sum=0;
for(i=1;i<=n;i++)
{
sum=sum+a[i];
}
cout<<sum<<endl;
}
}
细节处理:前4年均为1,无规律,直接开头进行赋值。
R
题目概述:有一楼梯共M级,刚开始时人在第一级,每次只能跨上一级或二级,
求要走上第M级,共有的走法数
思路:根据题目,可发现当M=1或2时,分别有1,2种走法,从M=3开始,走
法有了一定的规律,a[j]=a[j-1]+a[j-2],即斐波那契数列的问题。
原码:
#include<iostream>
using namespace std;
int main()
{
int a[41]={0},i,n,x;
a[1]=1;
a[2]=1;
a[3]=2;
for(i=4;i<=40;i++){
a[i]=a[i-1]+a[i-2];
}
cin>>n;
for(i=1;i<=n;i++){
cin>>x;
cout<<a[x]<<endl;
}
return 0;
}
细节处理:数组赋初值问题。
S
题目概述:求一只只能向右爬的蜜蜂从蜂房a爬到b的所有路线数。
思路:根据题目所给信息,发现蜂房号的差为1和2的时候,路线数分别为1
和2,蜂房号的差值从3开始,路线数有了一定的规律,即成立等式
f[i]=f[i-1]+f[i-2],因此就可以转换成斐波那契数列问题。
原码:
#include<iostream>
using namespace std;
int main()
{
long long ar[51]={0};
int i,n,x,a,b;
ar[1]=1;
ar[2]=1;
ar[3]=2;
for(i=4;i<=50;i++){
ar[i]=ar[i-1]+ar[i-2];
}
cin>>n;
for(i=1;i<=n;i++){
cin>>a>>b;
x=b-a+1;
cout<<ar[x]<<endl;
}
return 0;
}
细节处理:同上,数组赋初值问题。
K
题目概述:至少需要准备多少张人民币,才能在给每位老师发工资的时候都不用
找零
思路:根据题意可知,即从最大的开始选,才能保证最后需要的人民币数最少。
原码:#include<iostream>
using namespace std;
int gz(int x){
int ans=0;
while(x>=100){
x-=100;
ans++;
}
while(x>=50){
x-=50;
ans++;
}
while(x>=10){
x-=10;
ans++;
}
while(x>=5){
x-=5;
ans++;
}
while(x>=2){
x-=2;
ans++;
}
while(x>=1){
x-=1;
ans++;
}
return ans;
}
int main()
{
int i,j,k,n,x,ans;
cin>>n;
while(n!=0){
ans=0;
for(i=1;i<=n;i++){
cin>>x;
ans+=gz(x);
}
cout<<ans<<endl;
cin>>n;
}
return 0;
}
细节处理:应用整除和求余来进行计算。
W
题目概述:输入数据中不能含有4、62,求输入两个数之间有多少符合条件的数。
思路:循环取余判断余数是否为4或62.
原码:
#include<iostream>
#include<cstdio>
using namespace std;
int f(int x){
int a[10]={0},l=0;
while(x!=0){
l++;
a[l]=x%10;
if(a[l]==4)return 0;
if(a[l]==6&&a[l-1]==2)return 0;
x=x/10;
}
return 1;
}
int main()
{
int a,b,i,ans;
cin>>a>>b;
while(a!=0||b!=0){
ans=0;
for(i=a;i<=b;i++){
if(f(i)==1)ans++;
}
cout<<ans<<endl;
cin>>a>>b;
}
return 0;
}
细节处理:判断62时需要连续取余。
V
题目概述:有方程Ai=(Ai-1 + Ai+1)/2 - Ci,给出A0, An+1,和C1,C2, .....Cn
计算A1。
思路:推导出递归方程,然后进行编程计算。推导过程是举特例从 A4开始能枚
举出规律。
原码:
#include<iostream>
#include<string.h>
#include<algorithm>
#include<string>
#include<iomanip>
using namespace std;
int main()
{
double a[3002];
double c[3002];
int n;
while(cin >> n)
{
cin >> a[0];
cin >> a[n+1];
for(int i= 0 ; i<n;i++)
cin >> c[i];
double a1 = a[0]*n + a[n+1];
for(int i = 1; i<=n;i++)
a1 -= 2.0*i*c[n-i];
cout<<fixed<<setprecision(2)<<a1/(n+1)<<endl;
}
}
细节处理:最后保留小数问题要记得保留,利用数组解决问题。
第二套
C
题目概述:一只两点的坐标,求两点分别和原点连线的夹角的大小。
思路:运用cos的向量公式,取其反函数。
原码:
#include<iostream>
#include<stdio.h>
#include<cmath>
#define PI 3.1415926
using namespace std;
int main()
{
double x1,x2,y1,y2,m,n;
int T,i;
cin>>T;
for(i=1;i<=T;i++)
{
cin>>x1>>y1>>x2>>y2;
n=sqrt(x1*x1+y1*y1)*sqrt(x2*x2+y2*y2);
m=x1*x2+y1*y2;
printf("%.2lf\n",180*acos(m/n)/PI);
}
return 0;
}
细节处理:反函数求出的是弧度,需要将弧度转换成度。
D
题目概述:求一个后两位未知的整数被另一个整数整除时的后两位都可能是多少。
思路:将未知数后两位从00一直循环判断至99,若能整除,则输出。
原码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int n,i,a,b;
while(cin>>a>>b,!(a==0&&b==0))
{
n=0;
for(i=100*a;i<=100*a+99;i++)
{
if(i%b==0)
{
n++;
if(n==1)cout<<(i/10)%10<<i%10;
else cout<<" "<<(i/10)%10<<i%10;
}
}
cout<<endl;
}
return 0;
}
细节处理:00的输出,应一位一位地输出;
每行的末尾不能多输出空格,应先输出第一个,然后循环输出空格及
以后的各位数。
E
题目概述:求一个偶数可以被拆成多少组不同的素数。
思路:自定义素数函数,标记,循环计数i从2到n/2-1以及其对应的n-i均为素
数时的情况。
原码:
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int prim(int x)
{
int i;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0)return 0;
}
return 1;
}
int main()
{
int n,i,ans;
while(cin>>n,!(n==0))
{
ans=0;
for(i=2;i<=n/2-1;i++)
{
if(prim(i)==1&&prim(n-i)==1)ans++;
}
cout<<ans<<endl;
}
return 0;
}
细节处理:自定义素数函数时是否会超时,若超时,取根号;
不同素数,循环计数到n/2=1。
F
题目概述:判断一个四位正整数的十进制、十二进制、十六进制上各个位之和是
否,若相等,相等输出…否则,输出…。
思路:循环除其进制数取余相加,判断三个相加所得的和是否相等。
原码:
#include<cmath>
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
int a[10],b[10];
int main()
{
int n,i,a,b,c,t,h,d,sum1,sum2,sum3;
while(cin>>n,!(n==0))
{
a=n;sum1=0;
for(i=1;i<=4;i++)
{
t=a%10;
sum1=sum1+t;
a=a/10;
}
b=n;sum2=0;
for(i=1;;i++)
{
h=b%16;
sum2=sum2+h;
b=b/16;
if(b==0)break;
}
c=n;sum3=0;
for(i=1;;i++)
{
d=c%12;
sum3=sum3+d;
c=c/12;
if(c==0)break;
}
if(sum1==sum2&&sum2==sum3)cout<<n<<" is a Sky Number."<<endl;
else cout<<n<<" is not a Sky Number."<<endl;
}
}
细节处理:三次循环取余相加时不能破坏原数值,将其赋值给其他变量。
G
题目概述:判断是否存在x,y使得条件x+y=n、x*y=m同时成立。
思路:运用消元法,判断二次方程是否有整数解。
原码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,m,t,ans;
while(cin>>n>>m,!(n==0&&m==0))
{
ans=pow(n,2)-4*m;
t=sqrt(ans);
if(t*t==ans)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
细节处理:判断解是否为整数,即判断△是否为平方数。
H
题目概述:输出空心字符三角形。
思路:循环输入,当满足三边条件时输出字符,否则,输出空格。
原码:#include<cmath>
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
int main()
{
int n,i,j,ans=0;
char a;
while(cin>>a,!(a=='@'))
{
cin>>n;ans++;
if(ans==1)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=2*n-1;j++)
{
if(i==n||i+j==n+1||j-i==n-1)cout<<a;
else if(j-i>n-1)break;
else cout<<" ";
}
cout<<endl;
}
}
else
{
cout<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=2*n-1;j++)
{
if(i==n||i+j==n+1||j-i==n-1)cout<<a;
else if(j-i>n-1)break;
else cout<<" ";
}
cout<<endl;
}
}
}
return 0;
}
细节处理:两个测试数据之间存在一空行,先输出第一个,然后循环输出回车及
测试数据;
字符三角形每一行行末没有空格,加判断条件,当列数减行数大于n-1
时,停止本次列循环。
第一套
L
题目概述:判断倒序后的字符串是否和原字符串相同。
思路:将原字符串赋值给另一个变量,运用函数倒序,然后判断两变量是否相等。
原码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int n,i;
string s,t;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>s;
t=s;
reverse(t.begin(),t.end());
if(t==s)cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
细节处理:非自定义函数的运用,char和string的运用。
P
题目概述:求A的B次方的最后三位表示的整数。
思路:循环相乘取余。
原码:
#include<cmath>
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
int main()
{
int a,b,i,ans;
cin>>a>>b;
while(a!=0||b!=0){
ans=1;
for(i=1;i<=b;i++){
ans=ans*a%1000;
}
cout<<ans<<endl;
cin>>a>>b;
}
return 0;
}
细节处理:平方过大时会超出限定范围,所以边相乘边取余。
U
题目概述:多组输入测试数据,输出6+手机号码后五位。
思路:将其看作输入一组字符数组,输出“6”,然后循环输出后五位。
原码:#include<iostream>
using namespace std;
char a[15];
int main()
{
int i,j,N;
cin>>N;
for(i=1;i<=N;i++)
{
for(j=1;j<=11;j++)
{
cin>>a[j];
}
cout<<'6';
for(j=7;j<=11;j++)
{
cout<<a[j];
}
cout<<endl;
}
return 0;
}
细节处理:11位手机号码,不能看作整数直接输入。
斐波那契数列
H(类似)
题目概述:一头母牛每年年初生一头小母牛,每头小母牛从第四个年头开始,每
年年初也生一头小母牛,求第n年的时候,共有多少头母牛。
思路:列举前面几年每年新生的小牛,找规律,第i年新生的小牛数等于第1年
到第i-3年新生小牛数量之和。最后循环相加n年新生小牛数。
原码:
#include<iostream>
using namespace std;
int a[60];
int main()
{
int n,i,j,sum;
a[4]=1;a[3]=1;a[2]=1;a[1]=1;
while(cin>>n,!(n==0))
{
for(i=5;i<=n;i++)
{
a[i]=0;
for(j=i-3;j>=1;j--)
{
a[i]=a[i]+a[j];
}
}
sum=0;
for(i=1;i<=n;i++)
{
sum=sum+a[i];
}
cout<<sum<<endl;
}
}
细节处理:前4年均为1,无规律,直接开头进行赋值。
R
题目概述:有一楼梯共M级,刚开始时人在第一级,每次只能跨上一级或二级,
求要走上第M级,共有的走法数
思路:根据题目,可发现当M=1或2时,分别有1,2种走法,从M=3开始,走
法有了一定的规律,a[j]=a[j-1]+a[j-2],即斐波那契数列的问题。
原码:
#include<iostream>
using namespace std;
int main()
{
int a[41]={0},i,n,x;
a[1]=1;
a[2]=1;
a[3]=2;
for(i=4;i<=40;i++){
a[i]=a[i-1]+a[i-2];
}
cin>>n;
for(i=1;i<=n;i++){
cin>>x;
cout<<a[x]<<endl;
}
return 0;
}
细节处理:数组赋初值问题。
S
题目概述:求一只只能向右爬的蜜蜂从蜂房a爬到b的所有路线数。
思路:根据题目所给信息,发现蜂房号的差为1和2的时候,路线数分别为1
和2,蜂房号的差值从3开始,路线数有了一定的规律,即成立等式
f[i]=f[i-1]+f[i-2],因此就可以转换成斐波那契数列问题。
原码:
#include<iostream>
using namespace std;
int main()
{
long long ar[51]={0};
int i,n,x,a,b;
ar[1]=1;
ar[2]=1;
ar[3]=2;
for(i=4;i<=50;i++){
ar[i]=ar[i-1]+ar[i-2];
}
cin>>n;
for(i=1;i<=n;i++){
cin>>a>>b;
x=b-a+1;
cout<<ar[x]<<endl;
}
return 0;
}
细节处理:同上,数组赋初值问题。
K
题目概述:至少需要准备多少张人民币,才能在给每位老师发工资的时候都不用
找零
思路:根据题意可知,即从最大的开始选,才能保证最后需要的人民币数最少。
原码:#include<iostream>
using namespace std;
int gz(int x){
int ans=0;
while(x>=100){
x-=100;
ans++;
}
while(x>=50){
x-=50;
ans++;
}
while(x>=10){
x-=10;
ans++;
}
while(x>=5){
x-=5;
ans++;
}
while(x>=2){
x-=2;
ans++;
}
while(x>=1){
x-=1;
ans++;
}
return ans;
}
int main()
{
int i,j,k,n,x,ans;
cin>>n;
while(n!=0){
ans=0;
for(i=1;i<=n;i++){
cin>>x;
ans+=gz(x);
}
cout<<ans<<endl;
cin>>n;
}
return 0;
}
细节处理:应用整除和求余来进行计算。
W
题目概述:输入数据中不能含有4、62,求输入两个数之间有多少符合条件的数。
思路:循环取余判断余数是否为4或62.
原码:
#include<iostream>
#include<cstdio>
using namespace std;
int f(int x){
int a[10]={0},l=0;
while(x!=0){
l++;
a[l]=x%10;
if(a[l]==4)return 0;
if(a[l]==6&&a[l-1]==2)return 0;
x=x/10;
}
return 1;
}
int main()
{
int a,b,i,ans;
cin>>a>>b;
while(a!=0||b!=0){
ans=0;
for(i=a;i<=b;i++){
if(f(i)==1)ans++;
}
cout<<ans<<endl;
cin>>a>>b;
}
return 0;
}
细节处理:判断62时需要连续取余。
V
题目概述:有方程Ai=(Ai-1 + Ai+1)/2 - Ci,给出A0, An+1,和C1,C2, .....Cn
计算A1。
思路:推导出递归方程,然后进行编程计算。推导过程是举特例从 A4开始能枚
举出规律。
原码:
#include<iostream>
#include<string.h>
#include<algorithm>
#include<string>
#include<iomanip>
using namespace std;
int main()
{
double a[3002];
double c[3002];
int n;
while(cin >> n)
{
cin >> a[0];
cin >> a[n+1];
for(int i= 0 ; i<n;i++)
cin >> c[i];
double a1 = a[0]*n + a[n+1];
for(int i = 1; i<=n;i++)
a1 -= 2.0*i*c[n-i];
cout<<fixed<<setprecision(2)<<a1/(n+1)<<endl;
}
}
细节处理:最后保留小数问题要记得保留,利用数组解决问题。
第二套
C
题目概述:一只两点的坐标,求两点分别和原点连线的夹角的大小。
思路:运用cos的向量公式,取其反函数。
原码:
#include<iostream>
#include<stdio.h>
#include<cmath>
#define PI 3.1415926
using namespace std;
int main()
{
double x1,x2,y1,y2,m,n;
int T,i;
cin>>T;
for(i=1;i<=T;i++)
{
cin>>x1>>y1>>x2>>y2;
n=sqrt(x1*x1+y1*y1)*sqrt(x2*x2+y2*y2);
m=x1*x2+y1*y2;
printf("%.2lf\n",180*acos(m/n)/PI);
}
return 0;
}
细节处理:反函数求出的是弧度,需要将弧度转换成度。
D
题目概述:求一个后两位未知的整数被另一个整数整除时的后两位都可能是多少。
思路:将未知数后两位从00一直循环判断至99,若能整除,则输出。
原码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int n,i,a,b;
while(cin>>a>>b,!(a==0&&b==0))
{
n=0;
for(i=100*a;i<=100*a+99;i++)
{
if(i%b==0)
{
n++;
if(n==1)cout<<(i/10)%10<<i%10;
else cout<<" "<<(i/10)%10<<i%10;
}
}
cout<<endl;
}
return 0;
}
细节处理:00的输出,应一位一位地输出;
每行的末尾不能多输出空格,应先输出第一个,然后循环输出空格及
以后的各位数。
E
题目概述:求一个偶数可以被拆成多少组不同的素数。
思路:自定义素数函数,标记,循环计数i从2到n/2-1以及其对应的n-i均为素
数时的情况。
原码:
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int prim(int x)
{
int i;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0)return 0;
}
return 1;
}
int main()
{
int n,i,ans;
while(cin>>n,!(n==0))
{
ans=0;
for(i=2;i<=n/2-1;i++)
{
if(prim(i)==1&&prim(n-i)==1)ans++;
}
cout<<ans<<endl;
}
return 0;
}
细节处理:自定义素数函数时是否会超时,若超时,取根号;
不同素数,循环计数到n/2=1。
F
题目概述:判断一个四位正整数的十进制、十二进制、十六进制上各个位之和是
否,若相等,相等输出…否则,输出…。
思路:循环除其进制数取余相加,判断三个相加所得的和是否相等。
原码:
#include<cmath>
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
int a[10],b[10];
int main()
{
int n,i,a,b,c,t,h,d,sum1,sum2,sum3;
while(cin>>n,!(n==0))
{
a=n;sum1=0;
for(i=1;i<=4;i++)
{
t=a%10;
sum1=sum1+t;
a=a/10;
}
b=n;sum2=0;
for(i=1;;i++)
{
h=b%16;
sum2=sum2+h;
b=b/16;
if(b==0)break;
}
c=n;sum3=0;
for(i=1;;i++)
{
d=c%12;
sum3=sum3+d;
c=c/12;
if(c==0)break;
}
if(sum1==sum2&&sum2==sum3)cout<<n<<" is a Sky Number."<<endl;
else cout<<n<<" is not a Sky Number."<<endl;
}
}
细节处理:三次循环取余相加时不能破坏原数值,将其赋值给其他变量。
G
题目概述:判断是否存在x,y使得条件x+y=n、x*y=m同时成立。
思路:运用消元法,判断二次方程是否有整数解。
原码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,m,t,ans;
while(cin>>n>>m,!(n==0&&m==0))
{
ans=pow(n,2)-4*m;
t=sqrt(ans);
if(t*t==ans)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
细节处理:判断解是否为整数,即判断△是否为平方数。
H
题目概述:输出空心字符三角形。
思路:循环输入,当满足三边条件时输出字符,否则,输出空格。
原码:#include<cmath>
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
int main()
{
int n,i,j,ans=0;
char a;
while(cin>>a,!(a=='@'))
{
cin>>n;ans++;
if(ans==1)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=2*n-1;j++)
{
if(i==n||i+j==n+1||j-i==n-1)cout<<a;
else if(j-i>n-1)break;
else cout<<" ";
}
cout<<endl;
}
}
else
{
cout<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=2*n-1;j++)
{
if(i==n||i+j==n+1||j-i==n-1)cout<<a;
else if(j-i>n-1)break;
else cout<<" ";
}
cout<<endl;
}
}
}
return 0;
}
细节处理:两个测试数据之间存在一空行,先输出第一个,然后循环输出回车及
测试数据;
字符三角形每一行行末没有空格,加判断条件,当列数减行数大于n-1
时,停止本次列循环。
总结:经过3天的时间集中练习写程序,虽然有些痛苦,但是收获也是巨大的。虽然一遍遍修改,一遍遍输出,一遍遍提交,观察输出的错误,再进行修改之后,通过时不仅有知识的熟悉,更有欣喜与成就感。