一、题目简述:求从2开始的递增有序偶数数列的平均值序列
解题思路:首先,由题该数列为{2 4 6 8……2k}输入数列长度n和一个整数m,先求出共有n/m组数据,分别求出每组数据的平均值并输出,注意输出的数据之间用空格分开,若最后不足m个数据,则单独计算出剩下数据的平均值并输出。因为有多组测试数据,所以要用到while循环,用for语句累加计算平均值。
源码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,m,a,b;
while(cin>>n>>m)
{
a=0;
for(int i=1;i<=n/m;i++)
{
b=0;
if(i>1)
{
cout<<" ";
}
for(int j=1;j<=m;j++)
{
a=a+2;
b=b+a;
}
cout<<b/m;
}
if(n%m!=0)
{
b=0;
for(int j=1;j<=n%m;j++)
{
a=a+2;
b=b+a;
}
cout<<" "<<b/(n%m);
}
cout<<endl;
}
return 0;
}
二、计算给定年份母牛的数目
解题思路:首先,这是一道规律性的题目,写出几种情况后不难发现,前四年每年增加一头母牛,从第五年开始,最先出生的小母牛也开始生小母牛。
1 2 3 4 5 6 7 ……
1 2 3 4 6 9 13 ……
仔细观察可以得出从第五年开始母牛数=第n-1年数目+第n-3年数目。输入年份n,n=0时结束程序,n≠0时利用循环结构即可计算出母牛的数目。
源码:
#include<iostream>
#include<cstdio>
using namespace std;
int a[60];
int main()
{
int n,i;
while(cin>>n)
{
if(n==0)
break;
else
{
for(i=1;i<=4;i++)
{
a[i]=i;
}
for(i=5;i<=n;i++)
{
a[i]=a[i-1]+a[i-3];
}
}
cout<<a[n]<<endl;
}
return 0;
}
三、数列按绝对值从大到小排序后输出
解题思路:首先用数组输入n个整数,再利用函数fabs()取绝对值并用for循环进行从大到小排序,然后输出排序后的整数。注意每两个数之间用空格分开,但最后一个数后边没有空格。测试数据有多组。
源码:
#include<cstdio>
#include<cmath>
using namespace std;
int a[100];
int main()
{
int n,i,j,k;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
else
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(fabs(a[i])<fabs(a[j]))
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
}
printf("%d",a[0]);
for(i=1;i<n;i++)
{
printf(" ");
printf("%d",a[i]);
}
}
printf("\n");
}
return 0;
}
四、回文串的判定
解题思路:首先输入n和n个字符串,算出每个字符串的长度,对每个字符串判断是否对称,成立则输出yes,否则输出no.
注意:定义字符串需要头文件#include<string.h>或<cstring>。
字符串长度len=strlen()。
源码:
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
int main()
{
int n;
char aa[1000];
int len;
int i;
int sign;
scanf("%d",&n);
while(n--)
{
sign = 0;
scanf("%s",&aa);
len = strlen(aa);
for(i=0;i<len/2;i++)
{
if(aa[i] != aa[len-i-1])
{
sign =1;
break;
}
}
if(sign ==0)
printf("yes\n");
else
printf("no\n");
}
}
五、十进制数转化为R进制数
解题思路:首先要明确进制的转换算法,十以内的进制转换只需利用循环取余即可,但注意得出的结果是从个位开始的,输出时要倒置输出。十进制以上则需要用到字母,用if语句或swich语句来解决。源码:
#include<cstdio>
int main()
{
long n;
int a[1000],b,i,j,r;
while (scanf("%ld%d",&n,&r)!=EOF)
{
i=0;
if(n<0)
{
n=-n;
printf("-");
}
if(n==0)
printf("0");
while(n>0)
{
b=n%r;
a[i++]=b;
n=n/r;
}
i=i-1;
for(j=i;j>=0;j--)
{
if(a[j]==10) printf("A");
else if(a[j]==11) printf("B");
else if(a[j]==12) printf("C");
else if(a[j]==13) printf("D");
else if(a[j]==14) printf("E");
else if(a[j]==15) printf("F");
else printf("%d",a[j]);
}
printf("\n");
}
return 0;
}
六、集合A-集合B
解题思路:题目的意思是找出属于集合A但不属于集合B的元素并输出。首先输入两个集合的元素数目n,m,紧跟着输入两个集合中的各个元素,利用for循环找出符合要求的元素并按从小到大排序后输出。注意排序时可用sort函数,头文件#include<algorithm>。
源码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int a[101],b[101];
int n,m,i,j,k;
while (scanf("%d%d",&n,&m)!=EOF)
{
int flag[101]={0},num=0;
if (n==0&&m==0)
{
return 0;
}
else
{
for(i= 0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<m;i++)
{
cin>>b[i];
}
for(j=0;j<n;j++)
{
for(k=0;k<m;k++)
{
if(a[j]==b[k])
{
flag[j]=1;
}
}
}
for(i=0;i<n;i++)
{
if(flag[i]!=1)
{
sort(a,a+n);
cout<<a[i]<<" ";
num++;
}
}
if (num==0)
{
cout<<"NULL";
}
cout << endl;
}
}
return 0;
}
七、求A^B的最后三位数表示的整数
解题思路:输入A和B,最后三位整数的值完全可以通过一个大整数的最后三位确定,所以可以通过取余简化计算。
源码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int A,B,P,i;
while(cin>>A>>B)
{
if(A==0&&B==0)
{
return 0;
}
else
{
P=A%1000;
A=1;
for(i=1;i<=B;i++)
{
A=A%1000;
A=A*P;
}
printf("%d\n",A%1000);
}
}
return 0;
}
八、亲和数的判定
解题思路:首先根据题目可以明确亲和数的概念。一个数的所有真约数和等于另一个数,而另一个数的所有真约数和也等于这个数,则二者为亲和数。输入两个数,利用for循环分别求出其真约数的和,判断是否符合题意,成立则输出YES,否则输出NO。
源码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int M,sum1,sum2,i,A,B;
cin>>M;
while(M--)
{
sum1=0;
sum2=0;
cin>>A>>B;
for(int j=1;j<A;j++)
{
if(A%j==0)
{
sum1=sum1+j;
}
}
for(int k=1;k<B;k++)
{
if(B%k==0)
{
sum2=sum2+k;
}
}
if(sum1==B&&sum2==A)
cout<<"YES";
else
cout<<"NO";
cout<<endl;
}
return 0;
}
九、求走上M阶楼梯的走法
解题思路:首先输入n,表示n个测试数据,接着n输入测试数据m。仔细观察可得规律:
m 1 2 3 4 ……
走法数 1 1 2 3 ……
当m>3时,走法数=(m-1)时走法数+(m-2)时走法数。即可算出结果。
源码:
#include<cstdio>
int main()
{
int N,M,i,sum=0,a[41]={0};
scanf("%d",&N);
a[1]=1;
a[2]=1;
for(i=3;i<=40;i++)
a[i]=a[i-1]+a[i-2];
while(N--)
{
scanf("%d",&M);
printf("%d\n",a[M]);
}
return 0;
十、求蜜蜂爬到蜂房的路线数
解题思路:输入a,b表示从蜂房a到蜂房b,用for循环计算出蜜蜂可能爬行的路线,累加输出。注意while循环测试多组数据。
源码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
long long a,b,c,d,m;
int n,i,j;
while(cin>>n)
{
for(i=1;i<=n;i++)
{
c=0;d=1;
cin>>a>>b;
for(j=a;j<b;j++)
{
m=c+d;
c=d;
d=m;
}
cout<<m<<endl;
}
}
return 0;
}
十一、计算手机短号
解题思路:因为每个手机号码都是11位所以输出6后,在输出从第7位到第11位的数字即可。注意字符串的定义。
源码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int n,i,j;
char a[12];
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;
}
十二、计算买菜的钱数
解题思路:输入几组数据,每组数据包括菜种、数量、单价。分别算出每种菜所花钱数,累加起来即可求得结果。注意定义double类型数,结果保留一位小数。
源码:
#include<iostream>
#include<cstring>
#include<iomanip>
using namespace std;
int main()
{
double a,b,m=0;
char c[50];
while(cin>>c>>a>>b)
{
m=m+a*b;
}
cout<<setprecision(1)<<std::fixed<<m<<endl;
}
十三、孙悟空吃蟠桃 求蟠桃一开始有多少个
解题思路:由题最后一天剩一个桃子,则前一天剩下四个桃子,以此类推,利用for循环可得到结果。
源码:
#include<iostream>
using namespace std;
int main()
{
int a,t,i;
while(cin>>a)
{
t=1;
for(i=1;i<=a-1;i++)
t=(t+1)*2;
cout<<t<<endl;
}
return 0;
}
十四、求两个点分别于原点连线的夹角
解题思路:输入两个点的坐标,利用函数acos()和pow()可直接计算出夹角度数。注意结果保留两位小数和数学函数的头文件。
源码:
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int main()
{
double x1,y1,x2,y2,t,i;
int a;
cin>>a;
for(i=1;i<=a;i++)
{
cin>>x1>>y1>>x2>>y2;
t=acos((x1*x1+y1*y1+x2*x2+y2*y2-pow(x1-x2,2)-pow(y1-y2,2))/(2*sqrt(x1*x1+y1*y1)*sqrt(x2*x2+y2*y2))) *180/3.14159;
printf("%.2lf",t);
cout<<endl;
}
}
十五、两个整数加起来等于一个整数,乘起来等于另一个整数,判段其真假
解题思路:输入两个整数表示整数的和与积,通过for循环找到符合条件的数,得出共有几组,若有0组则输出No,否则输出Yes。注意要考虑到负数的情况。
源码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int a,b,i,sum;
while(cin>>a>>b)
{
if(a==0&&b==0)
break;
else
{
sum=0;
for(i=1;i*i<=fabs(b);i++)
{
if(b%i==0)
{
if(b/i+i==a||-(b/i+i)==a)
{
cout<<"Yes"<<endl;
sum++;
}
}
}
if(sum==0)
cout<<"No"<<endl;
}
}
return 0;
}