一、题目简述:求从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;
 }