《c++程序设计》课程设计报告
班级:___数学二班______________________学号:___2018212798__________
报告人姓名:____苏世成_______
实验地点: ___教学楼机房411________________________________
完成起止日期: ______2019年一月二号到五号______________________
问题描述:这次xhd面临的问题是这样的:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。
思路:先把余弦值求出来;利用余弦的反函数求出弧度,再把弧度转化成角度
代码:#include
#include
#include
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<
注意本题的反函数的写法,以及头文件
题目描述:有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数
思路:利用两个数的乘积,来找到因子,再来求出他们的和,判断是否符合条件
细节:两个因子的符号同时变化
代码:
#include
#include
using namespace std;
int main()
{
int a,b,sum,j;
while(cin>>a>>b)
{ if(a==0&&b==0)
break;//a==0&&b==0时循环结束
else
{sum=0;//用sum记录符合条件的
for(j=1;j*j<=abs(b);j++)
{if(b%j==0)
{if(b/j+j==a||-(b/j+j)==a)
{ cout<<"Yes"<
if(sum==0)
cout<<"No"<
问题描述:不同进制数字之和相等
思路:把不同进制的各位数字求出来,加起来求和比较
细节:Yes和No的大小写,输出时有" ."
代码:
#include
#include
using namespace std;
int main()
{
int a,l,h,k,g,m,n;
while(cin>>a)
{ if(a==0) break;
else
{l=0,k=0,h=0,g=a,m=a,n=a;
while(g!=0)
{l=g%10+l;g=g/10;}// 10进制的位数
while(m!=0)
{k=m%12+k;m=m/12;}//12进制的位数
while(n!=0)
{h=n%16+h;n=n/16;}//16进制的位数
if(l==k&&k==h)
else
}}
问题描述:输出字符三角形
思路:找到每一行与列数的关系
细节:注意每两个字符间空一行
代码:#include
#include
using namespace std;
int main()
{
char a;
int b,j,i,flag=1;
while(cin>>a)
{ if(a=='@') break;
else { cin>>b;
if(flag==1)//用flag调程序,第一次输入时不换行
flag=0;
else
cout<
for(i=1;i<=b;i++)
{if(i==b){for(j=1;j<=2*b-1;j++) cout<
else {for(j=1;j<=2*b-1;j++)
else if(j
else break;}}
cout<
问题描述:有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。
思路:用循环,当到达次数时我们输出一个平均数
细节:最后一个数没有空格
代码:
#include
#include
using namespace std;
int main()
{
int a,b,i,t,m,sum,c[101],k;
while(cin>>a>>b)
{
t=0,m=0,sum=0,k=0;
for(i=2;i<=2*a;i=i+2)
{ t=t+i;
sum++;
if(sum%b==0)
{c[k++]=t/b;t=0;sum=0;}}
if(t!=0)
c[k++]=t/sum;
for(i=0;i
{if(i==k-1) cout<
else cout<
cout<
题目描述:输出手机后六位
思路:利用字符串输出字符串后5位,前边输出一个6就可以了!
细节:最后要换行
代码:
#include
#include
using namespace std;
int main()
{
int a,b,i,t,m,sum,c[101],k;
while(cin>>a>>b)
{
t=0,m=0,sum=0,k=0;
for(i=2;i<=2*a;i=i+2)
{ t=t+i;
sum++;
if(sum%b==0)
{c[k++]=t/b;t=0;sum=0;}}
if(t!=0)
c[k++]=t/sum;
for(i=0;i
{if(i==k-1) cout<
else cout<
cout<
注意:利用字符串可以使复杂问题简单化。
题目描述:1个数的所有的真约数等于另一个数,而且另一个数的所有真约数等于这个数。
思路:每个数的公约数都求出来,再加起来,比较,输出结果
细节:最后换行,结果的大小写
代码:
#include
#include
#include
using namespace std;
int main()
{ int a,i,m,n,j,b,t;
cin>>a;
for(i=1;i<=a;i++)
{ cin>>m>>n;
t=0;
b=0;
for(j=1;j
if(m%j==0)
t=t+j;
for(j=1;j
if(n%j==0)
b=b+j;;
if(t==n&&b==m)
cout<<"YES";
else
cout<<"NO";
cout<
题目描述:在一个区间内,找出不含有62或4的所有车牌号的数量
思路:把所有不符合的先找出来,赋值1,输出时,输出不等于1的所有的和就可以了
细节:如果不先找来,会出现超时错误
代码:
#include
using namespace std;
int main()
{
int i,t,a[1000001],m,n,s,j;
for(i=1;i<1000000;i++)
{ t=i;
while(t>0)
{ if(t%100==62||t%10==4)
{ a[i]=1;} t=t/10; } }//找出所有不吉利数字
while(cin>>m>>n)
{ s=0;
if(m==0&&n==0) break;
else
{for(j=m;j<=n;j++)
{ if(a[j]!=1) {s++;} }//把吉利数字累加就可以了
cout<
题目描述:发工资寻找,所需钱币数量的最小数,钱币的大小为100,50,10,5,2,1
思路:利用求余运算,从所需面值最大数量到所需面值最小的数量
细节:防止运算过程的错误:
代码:#include
using namespace std;
int main()
{ int a,i,t,b;
while(cin>>a)
{ t=0;
if(a==0)
continue;
else
{for(i=1;i<=a;i++)
{ cin>>b;
t=t+b/100+(b%100)/50+(b%100%50)/10+(b%10)/5+(b%10%5)/2+b%10%5%2;} cout<
题目描述:判断一个字符串是不是回文串
思路:利用strlen函数求出字符串的长度,然后把第一个与最后一个比较,把第二个与倒数第二个比较,依次类推下去
细节:注意比较结束的条件,以及输出结果的大小写
代码:#include
#include
using namespace std;
int main()
{
int n,m,c;
cin>>n;
for(int i=0;i
{
char ch[101];
cin>>ch;
m=strlen(ch);
c=0;
for(int i=0,j=m-1;i
{
if(ch[i]==ch[j])
c++;
}
if(c==m/2) cout<<"yes"<
else cout<<"no"<
}
return 0;
}
题目描述:多项式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...,求出前n项和
思路:按找到每一项位置与每项的符号,大小关系
细节:结果保留两位小数
代码:#include
#include
#include
using namespace std;
int main()
{
double n,i,t,j,b;
cin>>n;
for(j=1;j<=n;j++)
{ cin>>b;
t=0;
for(i=1;i<=b;i++)
t=t+pow(-1,i-1)*1/i;
printf("%.2lf\n",t);}}
问题描述:求a的b次方的最后三位数
思路:每一次都除1000的余数求余,再乘起来
细节:不要超过32位整数的范围。
代码:#include
#include
using namespace std;
int main()
{ int a,b,t,i;
while(cin>>a>>b)
{ t=1;
if(a==0&&b==0)
break;
else
{for(i=1;i<=b;i++)
{ t=(a*t)%1000;}
cout<
递归题
题目大意:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年
初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
思路:利用递推,找每一项与前几项的关系
细节:最后输出要换行,还要注意输出时,对0的处理
代码:#include
#include
using namespace std;
int main()
{ int a[55],i,n;
a[1]=1,a[2]=2,a[3]=3;
for(i=4;i<55;i++)
{ a[i]=a[i-1]+a[i-3];}
while (cin>>n)
{ if(n==0)
break;
else
题目大意:有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
思路:利用递推的方法,把楼梯分为两种情况,从第四阶楼梯开始,我们可以把走楼梯,分为两部,一步是从比他低两阶的地方,走两步,一个是他比他第一阶的地方,走一步
细节:输出换行,还要注意递推时的关系不要写错了
代码: #include
#include
using namespace std;
int main()
{ int c[40],i,a,b;
c[1]=0,c[2]=1,c[3]=2;
for(i=4;i<=40;i++)
{
c[i]=c[i-1]+c[i-2];
}
cin>>a;
for(i=1;i<=a;i++)
{ cin>>b;
cout<
题目大意:有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).
若给出A0, An+1, 和 C1, C2, .....Cn.
请编程计算A1 = ?
思路:根据公式带入几项找到规律
细节:注意项数之间的关系
代码:#include
#include
using namespace std;
int main()
{
int n;
double Ao, An;
double num[3005];
while(scanf("%d", &n) != EOF)
{
scanf("%lf%lf", &Ao, &An);
for(int i = 1; i <= n; i++)
scanf("%lf", &num[i]);
double ans = double(n) / double(n + 1) * Ao + 1.0 / (n + 1) * An;
double k = double(n) * 2.0;
for(int j = 1; j <= n; j++)
{
ans -= k / (n + 1) * num[j];
k -= 2.0;
}
printf("%.2lf\n", ans);
}
return 0;
}