课程设计论文

一.水仙花

1.题意:“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。要求输出所有在m和n范围内的水仙花数。如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开; 如果给定的范围内不存在水仙花数,则输出no; 每个测试实例的输出占一行。
2.解题思路:

判读给定区间里的数是否为水仙花数(需要先分离出个位十位百位的数字,再用条件语句判断是否为水仙花数),若是借用数组存储起来,否则舍去。
再判断数组是否为空集,若为空集输出“no”,否则依次输出储存在数组里的数。
3.细节处理:
(1)输出最后的一个数后不需要加空格。因此利用循环输出前几个的数,单独输出最后一个数。否则会出现格式错误的提示。
(2)由于是利用循环语句判断给定区间里的数,若数组不为空集,此时数组里的数是从小到大存储的,无需进行排序。
4. 源代码:
#include <iostream>
using namespace std;

int main(){
    int i,n,m,s,q,p,j,o,k;
    int a[1000];
    while(cin>>m>>n)
{
    j=0;
    for(i=m;i<=n;i++)
{
q=i%10;
    k= i/10;
    p=k%10;
    k=k/10;
    s=k%10;
    if(q*q*q+p*p*p+s*s*s==i)
{
j++;
        a[j]=i;
}
}
    if(j==0)
    cout<<"no";
    else
    for(o=1;o<=j;o++)
    if(o!=j)
    cout<<a[o]<<" ";
    else
    cout<<a[o];
    cout<<endl;}
return 0;
}
二.小母牛
1.题意:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。要求算出第n(0<n<55)年的时候母牛的头数。注意:n=0时,不作处理。
2.解题思路:
(1)寻找规律:
❶先判断出每年母牛的增量,并将其定义在一个一维数组里。
前四年里由于小母牛没有生育能力,所以在前四年里每年母牛的增量为1。
②从第五年开始每年里母牛的增量等于前n-3年里增量的总和,由此可以借助计算出每年的增量。
❷最后利用数组前n项求和代表第n年里母牛的总数。
(2)先算出每年的增量,最后算出每年的总量。
3.细节处理:
(1)由于对输出没有特别的要求。最最重要的是寻找规律,并注意第一年里原母牛是否生育。
(2)在规律中注意增量与总量的区别以及年份与数组下标联系。
4.源代码:
#include<iostream>
using namespace std;
#define N 100
int main()
{
    int n,a[N];
    while (cin>>n)
    {
        if (n>0&&n<55)
        {
            for (int i=0;i<n;i++)
            a[i]=1;
            for (int i=4;i<n;i++)
            {
                a[i]=0;
                for (int j=0;j<i-2;j++)
                {
                    a[i]+=a[j];
                }
            }
            int sum=0;
            for (int i=0;i<n;i++)
            {
                sum+=a[i];
            }
            cout<<sum<<endl;
        }
    }
    return 0;
}
三.进制转换
1.题意:输入一个十进制数N(32位整数),将它转换成R(2<=R<=16)进制数输出。
2.解题思路:
(1)明确进制转换的方法(整除取余法),比将其借助代码实现。
3.注意细节:
(1)A-10,B-11,C-12,D-13,E-14,F-15
(2)负数要先取其绝对值之后再进行计算
4.源代码:
#include<stdio.h>
#include<cstring>
using namespace std;
int main()
{
    int n,r,i;
    while(scanf("%d %d",&n,&r)!=EOF)
    {
        if(n<0)
        {
            printf("-");n=-n;
        }
        if(n==0){printf("0\n");
        continue;
        }
        int c=0,a[100];
        while(n)
        {
            a[c]=(n%r);
            c++;
            n/=r;
        }
        for(i=c-1;i>=0;i--)
        {
            if(a[i]>=10)
            {
                printf("%c",'A'+a[i]-10);
            }
            else printf("%d",a[i]);
        }
        printf("\n");
    }
}
四.爬楼梯的走法
1.题意:一楼梯共M级,刚开始时在第一级,每次只能跨上一级或二级,求走上第M(1<=M<=40)级的走法种数。
2.解题思路:
阶数小于4时的种类为阶数减一;当结束大于等于4时种类数为第n-i和第n-2阶种类之和。
3.细节处理:
(1)直接定义数组的前三项,后几项利用循环求解。
4.源代码:
#include<iostream>
using namespace std;
#define Y 100
int main()
{
    int n,m,i,a[Y];
    a[1]=0;
    a[2]=1;
    a[3]=2;
    for (i=4;i<41;i++)
    a[i]=a[i-1]+a[i-2];
    while (cin>>n)
    {
        for (int j=1;j<=n;j++)
        {
            cin>>m;
            cout<<a[m]<<endl;
        }
}

五.蜜蜂爬蜂房
1.题意:蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。

2.解题思路:先写出几项简单的值计算一下,找出其中规律第n个蜂房的路线等于第n-1个蜂房的路线与第n-1个蜂房的路线之和。并且蜂房之间差相等时路线是相同的。
3.注意细节:
(1)规律的寻找时还要找到符合前几个值的式子
4.源代码:
#include<iostream>
using namespace std;
int main()
{
    int i,m,j,k;
    long long a,b,p;
    cin>>m;
    for(i=0; i<m; i++)
    {
        a=1,b=0;
        cin>>j>>k;
        for(int t=0; t<=k-j; t++)
        {
            p=b;
            b=a+b;
            a=p;
        }
        cout<<b<<endl;
    }
    return 0;
}
六.回文串
1.题意:“回文串”是一个正读和反读都一样的字符串,判断读入的字符串是否是“回文”。
2.解题思路:先利用读入字符串,再判断字符的长度,并利用数组下标来控制字符串单个字符是否对应相等。
3.注意细节:
(1)利用strlen()来判断字符串的长度,且头文件为<cstring>。
(2)字符串的类型为char
4.源代码:
#include<iostream> 
#include<cstring>
using namespace std;
int main()
{
    int n,i,len,j;
    char s[100];
    while (cin>>n)
    {
        getchar();
        while(n--)
        {
            gets(s);
            len=strlen(s);
            i=0;j=len-1;
            while((i<j)&&(s[i]==s[j]))
            {
                i++;
                j--;
            }
            if(i>=j)
            cout<<"yes"<<endl;
            else
            cout<<"no"<<endl;
        }
    }
    return 0;
}
七.有序偶数的平均值
1.题意:有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。
2.解题思路:
先初始化数组为一个有序偶数序列,再用m分割,求其平均值。
3.注意细节:
(1)数组值与对应下标的关系要找准确。
(2)分割时注意最后一组是否是m个元素。
4.源代码:
#include<stdio.h>
int main()
{
    int m,n,i,line[104],s,j,h;
    int aver1,aver2;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        line[0]=2;
        for(i=1;i<n;i++)
        line[i]=line[i-1]+2;
        h=n%m;
        for(j=0;j<n/m;j++)
        {
            s=0;
            for(i=j*m;i<(j+1)*m;i++)
            s=line[i]+s;
            aver1=s/m;
            if(j==0)
            printf("%d",aver1);
            else printf(" %d",aver1);
        }
        if(h!=0)
        {
            s=0;
            for(i=n-h;i<n;i++)
            s=s+line[i];
            aver2=s/h;
            printf(" %d",aver2);
        }
        printf("\n");
    }
    return 0;
}
八.龟兔赛跑(该题的解题思路由舍友完成,这道题不在自己能力范围之内,摘出来仅为分享好的题目)
1.题意:给兔子恒定的初速度vr,乌龟骑电车速度是vt1,爬行的速度是vt2。在长l的赛道上有n个充电站,每一次充电可以跑c远的距离,但充一次电需要t时间,而且知道每一个充电站距离起点的距离是lj1、lj2…求兔子和乌龟到终点的快慢。
2.解题思路:采用递推的思想,每到达一个充电桩都有一个最短时间,如果前面到达每个充电桩是最短的时间,那么最后到达终点也是最短的时间。对于充电桩i来说,它可以由前面的i-1个充电桩和起点到达,分别计算充一次电的情况下,到达充电桩i的时间,最小的一个就是从起点到充电桩i的最短时间,依次递推,就可以得到到终点的最短时间。
3.注意细节:
⑴递推思想的应用。
⑵由于数据类型较多,要分清自己设置变量的类型以及之间的关系代表。
4.源代码:
#include<iostream>
#include<cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
double L,C,T,vr,vt1,vt2;
int N;
double ans[150];
int main()
{
    while(cin >> L){
        cin >> N >> C >> T;
        cin >> vr >> vt1 >> vt2;
        for(int i=1;i<=N;i++)
            cin >> ans[i];
        ans[0] = 0;
        ans[N+1] = L
        double t = L/vr;
double dp[150];         
        memset(dp,0,sizeof(dp));
        for(int i=0;i<=N+1;i++){       
            double len = ans[i];
            if(C>=len)
{
                dp[i] += len/vt1;
            }
            else{
                dp[i] += C/vt1 + (len-C)/vt2;
            }
        }
        for(int i=0;i<=N;i++)
{
            for(int j=i+1;j<=N+1;j++)
{
                double len = ans[j] - ans[i];
                double cost = 0;
                if(C >= len)
{
                    cost += len/vt1;
                }
                else{
                    cost += C/vt1 + (len-C)/vt2;
                }
                if(i!=0)
{
                    cost += T;
                }
                dp[j] = min(dp[j],dp[i]+cost);  
            }
        }
        if(dp[N+1] > t)
{
            cout << "Good job,rabbit!" << endl;
        }
        else cout << "What a pity rabbit!" << endl;
    }
九.手机号码找短号
1.题意:假设所有的短号都是是 6+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。给一个11位长的手机号码,找出对应的短号
2.解题思路:用一位数组存储十一位电话号码,先输出一个6,再提取出数组后五位即可
3.注意细节:
(1)数字6的输出应该早于数组后5位的提取
4.源代码:
#include <iostream>
using namespace std;
int main()
{
    int N;
    char L[12];
    cin >> N;
    while (N--)
    {
        for (int i = 1; i <= 11; i++)
        cin >> L[i];
        cout << 6;
        for (int i = 7; i <= 11; i++)
        cout << L[i];
        cout << endl;
    }
    return 0;
}
十.计算方程的值
1.题意:有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).给出A0, An+1, 和 C1, C2, .....Cn.计算A1 的值。
2.解题思路:先写出前几项,用归纳法找出同时。
3.注意细节:
(1)定义的类型应该是double
(2)规律寻找时应该
4.源代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        double x,a0,an,sum;
        scanf("%lf%lf",&a0,&an);
        sum=an+n*a0;
        for(int i=n;i>=1;i--)
        {
            scanf("%lf",&x);
            sum-=2*x*i;
        }
        sum=sum/(n+1);
        printf("%.2lf\n",sum); 
    }
    return 0;
}
十一.车牌号
题意:不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914都属于不吉利号码62连号,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
解题思路:首先判断区间数字是否为不吉利数字(如遇6和2,要判断是否相连),如果有则为真值,再判断有多少个真值,
注意细节:
(1)6和2不连号不是不吉利数
源代码:
#include <iostream>
using namespace std;
int s[1000000];
int main()
{
 s[1000000] = { 0 };
 int n, m, i, q, c = 0, z;
 for (i = 1; i <=1000000; i++)
 {
  z = i;
  while (z)
  {
   q = z % 10;
   z = z / 10;
   if (q == 4)
   {
    c++;
    break;
   }
   else if ((q == 2) && (z % 10 == 6))
   {
    c++;
    break;
   }
  }
  s[i] = c;
 }
 while (cin >> n >> m)
 {
  if (n == 0 && m == 0)
   break;
  cout << m - n + 1 - (s[m]-s[n-1]) << endl;
 }
 system("pause");
 return 0;
}
十二.夹角
题意:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。
解题思路:
利用数学公式求解出两点之间的距离和夹角。
注意细节:
夹角的范围[0,180],两个点不会在圆心出现。

(2)结果精确到小数点后两位。
源代码:
#include<cstdio>
#include<cmath>
#define PI acos(-1.0)
int main()
{
    double x1,y1,x2,y2;
    int ncase;
    scanf("%d",&ncase);
    while(ncase--)
    {
        scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
        printf("%.2lf\n",acos((x1*x2+y1*y2)/(sqrt(x1*x1+y1*y1)*sqrt(x2*x2+y2*y2)))*180/PI);
    }
 
    return 0;
}
十三.拆偶数
题意:把偶数拆成两个不同素数的和,求拆法的种类
2.解题思路:偶数可以对半开,所以外面只需要判断偶数的一半有多少种拆分方法就可以了
3.注意细节:
遇见0不处理。
每个结果占一行,所以输出后不要忘记加换行符号。
4.源代码:
#include<iostream>
using namespace std;
bool sushu(int n)
{
    int i;
    if(n==2) return true;
    else if(n>2)
    {
        for(i=2;i*i<=n;i++)
        {
            if(n%i==0)
            return false;
        }
        return true;
    }
}
十四.sky
题意Sky数:例如:2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22。要求判断任何一个十进制的四位数。
解题思路:
先利用整除取余法将数字转换成十进制,十二进制,十六进制。再其和
注意细节:
(1)整数转换为十进制,十二进制,十六进制时要区分开,不能用通法。
源代码:
#include<iostream>
using namespace std;
int main()
{
    int n,m,r;
    int a,b,c,d;
    int x,y,z;
    while(cin>>n)
    {
        if(n==0) break;
        m=n;
        x=0;y=0;z=0;
        a=n%10;
        b=(n%100)/10;
        d=n/1000;
        c=n/100-d*10;
        x=a+b+c+d;
        while(n)
        {
            r=n%12;
            n=n/12;
            y+=r;
        }
        n=m;
        while(n)
        {
            r=n%16;
            n=n/16;
            z+=r;
        }
        if(x==y&&x==z) cout<<m<<" is a Sky Number."<<endl;
        else cout<<m<<" is not a Sky Number."<<endl;
    }
}
十五.末二位
题意:末二位未知的整数,能被另一个整数除尽,求该数的末二位。要求遇00不处理。
解题思路:
利用循环从一开始依次查找
注意细节:
(1)每个尾数后要跟一个空格,最后一个数后面没有空格。
源代码:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
      int a,b;
      while(scanf("%d %d",&a,&b)&&a||b)
      {
          a=a*100;
          int k=0;
          for(int i=0;i<=99;i++)
          {
              if((a+i)%b==0)
              {
                  k++;
                  if(k==1)
                  {
                  if(i<10)
                  {    
                  printf("0");
                    printf("%d",i);    
                  }
                  else
                  printf("%d",i);
                  }
                else
                {
                if(i<10)
                  {
                  printf(" 0");
                  printf("%d",i);
                  }
                  else
                printf(" %d",i);
                }
              }
          }
          printf("\n");
       } 
    return 0;
}

 

 

 

总结:
⑴拿到一个题时应该先弄清其中的规律,但是规律并不是那么好找。应该多在纸上写写。
灵活运用知识点,不应该仅仅局限于老师讲的。例如:求绝对值时,可以直接使用库函数调用abs()。
⑵对于相同问题的处理要注意不同情景下的不同要求。例如:排序问题。对于不要求标记与否都需要用不同的排序方法,也就要求自己对于同一个问题,要有不同的解题思路。
⑶要有耐心,自己对程序设计掌握并不牢固,很多时候用到的知识点都需要翻书找。经过短短几天的练习,也有一定的进步。但是还是停留在初级阶段。无论今后是否会用到程序设计,依旧要坚持学下去。
⑷上课听讲挺重要的,课下练习更重要。自己由于之前练习的缺少,写代码的手速并不是很快,进而导致思路不畅,相同程序自己花费时间会更长。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值