《C++程序设计》课程设计报告
一
Problem B
-
题意:输出所有在给定范围内的水仙花数(水仙花数是一个三位数,它的各位数字的立方和等于其本身)。
-
解题思路:用while语句输入多组数据,首先用for语句循环给定范围的每一个数,接着把个十百位数表示出来,用if语句进行判断。
-
细节处理:每一组数据的输出要换行,一组数据中的输出数要用空格间隔,最后一个数后面不能有空格。
-
源代码
#include
#include
using namespace std;
int main()
{
int m,n,i,a,b,c,d=0;
while(cin>>m>>n)
{
for(i=m;i<=n;i++)
{
a=i/100;
b=i/10%10;
c=i%10;
if(iaaa+bbb+ccc)
{
d++;
if(d1)
cout<<i;
else
cout<<" "<<i;
}
}
if(d==0)
cout<<“no”;
d=0;
cout<<endl;
}
return 0;
}二 Problem D
-
题意:对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
-
解题思路::用while语句输入多组数据,首先用for语句循环给定范围的每一个数,用sqrt()函数判断是否为素数。
-
细节处理:多组数据之间的输出要换行,还有字母的大小写。
-
源代码
#include
#include
#include
using namespace std;
int main()
{
int x,y,j,i,a,m,n;
while(cin>>x>>y)
{ a=0;
if(x0&&y0)
break;
else
{
for(i=x;i<=y;i++)
{
m=i*i+i+41;
n=sqrt(m);
for(j=2;j<=n;j++)
{
if(m%j0)
a++;
}}
if(a0)
cout<<“OK”;
else
cout<<“Sorry”;
}
cout<<endl;
}
}
三
Problem G
- 题意:去掉一个最高分和一个最低分,然后计算平均得分。
- 解题思路:把得分放在数组里,然后进行排序,将首尾数组定义为0,接着运用for循环累加求和再求平均值。
- 细节处理:定义输出结果为double类型,注意sort()函数使用加头文件algorithm,表示输出结果时需要从整型转换成实型,输出结果保留两位小数。
4.源代码
#include
#include
#include
using namespace std;
int a[110];
int main()
{
int n,i,sum;
double b;
while(cin>>n)
{
for(i=0;i<n;i++)
{
cin>>a[i];
}
sum=0;
sort(a,a+n);
a[0]=0;
a[n-1]=0;
for(i=1;i<n-1;i++)
{
sum=sum+a[i];
}
b=(1.0)*sum/(n-2);
cout<<fixed<<setprecision(2)<<b<<endl;
}
}
四
Problem H
- 题意:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
- 解题思路:运用数组,首先定义出前三年的牛数,根据递归规律,表示出第四年开始的牛数,发现第N年的牛数等于第N-1年和第N-3年牛数之和,通过for循环表示出来。
- 细节处理:正确寻找出递归规律,并正确表示出来。
- 源代码
#include
using namespace std;
int main()
{
int cow[60];
cow[1]=1;
cow[2]=2;
cow[3]=3;
for(int i=4;i<=60;i++)
{
cow[i]=cow[i-1]+cow[i-3];
}
int n;
while(cin>>n)
{if(n==0)
break;
else
{
cout<<cow[n]<<endl;
}}
return 0;
}
五
Problem L
-
题意: “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
-
解题思路:判断字符串是否为回文串,需要对字符串中每个字符进行比较,用strlen()求字符串长度,然后通过for循环比较,最后用if进行判断。
-
细节处理:for循环中要从两边向中间靠拢,一定要有J>i,运用bool类型也要注意字母拼写。
-
源代码
#include<stdio.h>
#include<string.h>
#include
using namespace std;
int main()
{
char a[110];
int n;
scanf("%d",&n);
while(n–)
{
scanf("%s",a);
int len=strlen(a);
bool m=true;
for(int i=0,j=len-1;j>i;i++,j–)
{
if(a[i]!=a[j])
{
m=false;
}
}
if(m==true)
printf(“yes\n”);
else
printf(“no\n”);}
}
六
Problem M
- 题意:输入一个十进制数N,将它转换成R进制数输出。
- 解题思路:先用if语句判断N的正负,如果N=0,输出N,如果N<0,令N=-N,并输出一个负号,可以用变量记录,如果N>0,不作处理。接着用while语句循环,运用N%r和N/R,将每一次的求余存进一个数组里,然后逆序输出,如果<10,直接输出,>=10,进行强制类型转换,将其转换成字符。
- 细节处理:对N正负的判断及处理,注意逆序输出数组,最后进行类型转换。
- 源代码
#include
#include
#include
using namespace std;
int main()
{
int arr[1000];
int r,len,flag;
long long a;
while(cin>>a>>r)
{
len=0;
flag=0;
if(a==0)
{
cout<<a;
}
while(a!=0)
{
if(a<0)
{
a *= -1;
flag=1;
}
arr[len++]=a%r;
a/=r;
}
for(int i = len-1;i>=0;i–)
{
if(flag)
{
cout<<"-";
flag=0;
}
if(arr[i]<=9)
cout<<arr[i];
else
{
printf("%c",arr[i]-10+‘A’);
}
}
cout<<endl;
}
return 0;
}
七
Problem P
-
题意:求A^B的最后三位数表示的整数。
-
解题思路:求最后三位数可以不用求出A的B次方结果,通过for循环只求后三位数乘积。
-
细节处理:赋初值s=1,循环次数控制好,每组数据要换行处理。
-
源代码
#include
#include
using namespace std;
int main()
{
int a,b,s,i;
while(cin>>a>>b)
{if(a0&&b0)
break;
else
{
s=1;
for(i=1;i<=b;i++)
{
s=(s*a)%1000;
}cout<<s; } cout<<endl; }} 八 Problem S
-
题意:有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
-
解题思路:首先寻找递归规律,相隔一个蜂巢有一个路线,相隔两个蜂巢有两个路线,相隔三个蜂巢以上,路线数等于前两个之和,运用for语句循环。
-
细节处理:起点不是第一个蜂巢,要准确找出规律。
-
源代码
#include
#include
using namespace std;
long long c[60];
int main()
{
int a,b,i,n,m;
c[1]=1;
c[2]=2;
cin>>n;
while(n–)
{
cin>>a>>b;
m=b-a;
for(i=3;i<=m;i++)
{
c[i]=c[i-1]+c[i-2];
}
cout<<c[m]<<endl;
}
return 0;
}九
Problem U
- 题意:假设所有的短号都是是 6+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。现在,给你一个11位长的手机号码,找出对应的短号。
- 解题思路:将号码中的每一个数字定义成一个字符,通过循环输出后五位数。
- 细节处理:再循环前不要忘记输入6,定义数字用char.
- 源代码:
#include
#include
using namespace std;
int main()
{
int n,i;
char a[12];
cin>>n;
while(n–)
{
for(i=1;i<=11;i++)
{
cin>>a[i];
}
cout<<“6”;
for(i=7;i<=11;i++)
{
cout<<a[i];
}
cout<<endl;
}}
十
Problem W
1.题意:不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
2.解题思路:首先用bool类型对不吉利号码赋初值,然后用for循环判断是否符合,符合就累加。
3.细节处理:注意bool类型的使用和正确赋初值,最后结果是n-m+1-num注意不要忘记减去1。
#include
bool unlucky(int a)
{
while(a!=0)
{
if(a%104||a%10062)
{
return true;
}
a/=10;
}
return false;
}
using namespace std;
int main()
{
int m,n,i,sum,num;
while(cin>>m>>n,m!=0&&n!=0)
{
num=0;
for(i=m;i<=n;i++)
{
if(unlucky(i)==true)
num++;
}
sum=n-m+1-num;
cout<<sum<<endl;
}
return 0;
十一
Problem C2
- 题意:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。
- 解题思路:通过坐标把三边长表示出来,运用余弦定理求出夹角余弦值,用反三角函数求出夹角。
- 细节处理:定义坐标点和PI用双精度,头文件要有cmath结果保留两位小数,反三角函数的正确表示。
- 源代码
#include
#include
#include
using namespace std;
int main()
{
int n;
double x1,x2,y1,y2,a,b,c,d;
double PI=3.1415926;
cin>>n;
while(n–)
{
cin>>x1>>y1>>x2>>y2;
a=sqrt(x1x1+y1y1);
b=sqrt(x2x2+y2y2);
c=sqrt((x1-x2)(x1-x2)+(y1-y2)(y1-y2));
d=(aa+bb-cc)/(2a*b);
cout<<fixed<<setprecision(2)<<acos(d)*180.00/PI<<endl;
}
}
十二
Problem D2
-
题意:一个整数,只知道前几位,不知道末二位,被另一个整数除尽了,那么该数的末二位该是什么。
-
解题思路:构建方程(a%b*100+i)==0,输出i值。
-
细节处理:注意空格处理,对m赋初值,运用累加控制空格。
-
源代码
#include
#include
using namespace std;
int main()
{
int a,b,x,i,m;while(cin>>a>>b) { if(a==0&&b==0) break; else { m=0; for(i=0;i<=99;i++) { if((a%b*100+i)%b==0) { if(i==0) {cout<<"00"; m++;} else if(i>0&&i<10) {m++; if(m=1) cout<<"0"<<i; else cout<<" "<<"0"<<i;} else if(i>=10) {m++; if(m==1) cout<<i; else cout<<" "<<i;} } } }
cout<<endl;}
}
十三
Problem E2
- 题意:把一个偶数拆成两个不同素数的和,求有几种拆法。
- 解题思路:首先通过for循环对素数进行判断,用while循环输入多组数据,再用for循环判断是否两个不同的素数之和。
- 细节处理:处理素数时要用sqrt,所以要加头文件cmath,找两个素数时要注意循环不要过度,并且两个素数不相等。
- 源代码
#include
#include
#include
using namespace std;
int prime(int x)
{
int i;
double n;
n=sqrt(x);
for(i=2;i<=n;i++)
{
if(x%i0)
return 0;
}
return 1;
}
int main()
{
int x,j,k,sum;
while(cin>>x)
{
if(x0)
break;
else
{
sum=0;
for(j=2;j<=x/2;j++)
{
k=x-j;
if(prime(j)&&prime(k)&&k!=j)
sum++;
}
cout<<sum<<endl;
}
}
return 0;
}
十四
Problem G2
- 题意:有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,判断这种整数到底存不存在。
- 解题思路:根据两个方程可以构建一个一元二次方程组,转化成求根问题,首先判断是否有根,若有根,表示出两根,
- 细节处理:定义要用double类型,把两个方程正确转化为一个一元二次方程,求根时运用根号函数,所以头文件要用cmath。
- 源代码
#include
#include
#include
using namespace std;
int main()
{
int a,b;
double x,y;
while(cin>>a>>b)
{
if(a0&&b0)
break;
else{
x=0,y=0;
if(aa-4b<0)
cout<<“No”<<endl;
else
{
x=(a+sqrt(aa-4b))/2;
y=(a-sqrt(aa-4b))/2;
if(x*100int(x)100&&y100int(y)*100)
cout<<“Yes”<<endl;
else
cout<<“No”<<endl;
}
}
}
}
十五
Prublem
-
题意:输出符合要求的高为n,底为2n-1的等腰三角形。
-
解题思路:首先运用嵌套循环正确输出三角形,然后处理空格问题,最后处理输出换行问题。
-
细节处理:定义符号用char,输出三角形用嵌套时用或连接条件,三角形的里面和左边输出空格,右边不输出空格,第一组数据输出三角形后每一个都空一行输出。
-
源代码
#include
#include
using namespace std;
int main()
{
int i,j,n,a;
char m;
a=0;
while(cin>>m>>n)
{
a++;
if(a>1)
cout<<endl;
if(m==’@’)
break;
else
{for(i=1;i<=n;i++) { for(j=1;j<=2*n-1;j++) { if(i+j==n+1||j-i==n-1||i==n) cout<<m; else if(j-i<=n-2) cout<<" "; } cout<<endl; } }
}
总结:C语言课程到这里已经接近尾声,这学期我们学了程序设计的一点基础知识,对于我们数学系的学生来说,学的太少太少。C语言是一门有趣的语言,一开始觉得头疼,但深入进去之后,你会无法自拔,有时候会觉得编程序会上瘾。它锻炼的不仅仅是我们的编程能力,更是我们的逻辑思维能力,通过多角度解决问题,只要有一个小地方出错,就不能AC,联系到生活中,每件事情都要专注对待,不能出一点差错。感谢老师和同学在这段时间对我的帮助,老师的和蔼可亲以及同学的互帮互助都让我觉得倍感温暖。我坚信我和程序设计的缘分还没结束,在老师和同学的帮助下,我一定会在这条路上越走越远。