一.(problem R(1018))
题意:
站在楼梯第一级,每次只能走一级或两级,共走M级,共有几种方法。
解题思路:
现设一个数组,并将数组归零。然后将前40个数储存起来,每一个数都等于它本身前面两个数的加和,依次相加,直到第四十个数。然后根据输入的M(1<=M<=40),输出相应的第M个数。
解题细节:
第一个数跟第二个数(第一级楼梯跟第二级楼梯)都是1,要仔细找出每级楼梯之间的规律才能准确解题。
源码:
#include<stdio.h>
int main()
{
int N=0,M=0,i=0,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 1;
}
二.(problem Q(1017))
题意:
判断两个数是否是亲和数。
解题思路:
先用循环语句把两个数各自的真约数找出来并求和,在找真约数的过程中为了防止超时,可以对给定的数进行除以2再加1的运算后,对得到的新数进行运算。再用条件语句判断求和所得的数是否等于另外一个数。
解题细节:
注意循环语句不能超时,同时要注意排除1和其本身。
源码:
#include <iostream>
using namespace std;
int main()
{
int n;
int a,b;
int i,j,sum;
bool flag;
cin>>n;
for(i=0;i<n;i++){
cin>>a>>b;
flag=true;
for(sum=0,j=1;j<b/2+1;j++){
if(b%j==0)sum+=j;
}
if(sum!=a)flag=false;
for(sum=0,j=1;j<a/2+1;j++){
if(a%j==0)sum+=j;
}
if(sum!=b)flag=false;
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
三.(problem P(1016))
题意:
求A的B次方的末尾的三位数。
解题思路:
用循环语句是A从一次方开始计算,一直乘到A的B次方,在每一次循环后取所得结果的末尾的三位数来进行下一次循环,最后输出最后一次循环所得的结果。
解题细节:
为了防止得到的结果数据超出开始所定义的数据范围,可以只对数据的末尾三位数进行运算。
源码:
#include <iostream>
using namespace std;
int main()
{
int n;
int a,b;
int i,j,sum;
bool flag;
cin>>n;
for(i=0;i<n;i++){
cin>>a>>b;
flag=true;
for(sum=0,j=1;j<b/2+1;j++){
if(b%j==0)sum+=j;
}
if(sum!=a)flag=false;
for(sum=0,j=1;j<a/2+1;j++){
if(a%j==0)sum+=j;
}
if(sum!=b)flag=false;
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
四.(problem O(1015))
题意:
对两个集合做减法运算,求两个集合的差。
解题思路:
两个集合的差,就是找出集合A中集合B没有的元素。先将两个集合分别输入两个数组中储存起来,然后用循环语句挑出集合A中有但集合B中没有的元素,把这些挑出的元素用一个归零的数组储存,最后判断新数组里的元素是否跟集合A中的元素相同,要是相同,输出“NULL”,要是不同,再用循环语句对新数组进行排序,然后挨个输出。
解题细节:
在每次输入输出一组数据后要把数组重新清零后,再输入另外一组数据。
源码:
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
int n,m,i,j,k,count,min;
int a[100],b[100],c[100]={0},d[100];