第五题
题意:
给出一组数,求其倒数的和。
分析:
由题意得,取倒数时应用float(1.0),int会导致结果为0;
奇数项和偶数项的符号不同,使用if 语句进行分类。判断奇偶数,奇数项相加,偶数项相减。
多个数使用嵌套循环,从1到m循环。
代码如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int m,i,j,n[101];
float t,s;
cin>>m;
for(i=1;i<=m;i++)
cin>>n[i];
for(i=1;i<=m;i++)
{
s=0;
for(j=1;j<=n[i];j++)
{
t=1.0/j;
if(j%2!=0)
{s=s+t;}
if(j%2==0)
{s=s-t;}
}
cout<<fixed<<setprecision(2)<<s<<endl;
}
return 0;
}
第六题
题意:
给出n个起始值为2的有序偶数,每m个取其平均值,不足m个的以实际量求平均值。
分析:
分成两段,先求每m个平均值,再对剩余数取平均值。
使用循环嵌套取平均值时,求和的初始值是0,定义在循环前,每次循环前清除前次累加和。
每个数的值依次增加2,在循环内累加,求和。
不足的部分循环累加,取平均值。
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int j,a,i,n,m,sum;
while(cin>>n>>m)
{
a=0;
for(i=0;i<n/m;i++)
{
sum=0;
if(i>0)
cout<<" ";
for(j=0;j<m;j++)
{
a=a+2;
sum=sum+a;
}
第八题
题意:
小母牛四天长大,成熟的母牛每天生一头小牛,求第n天的牛的数目。
分析:
递归算法。第n天牛的数目=昨天牛的数目+今天新生牛的数目。
因为牛第四天开始生小牛,a[i]=a[i-1]+a[i-3]
使用循环,从第四天开始,进行递推。
代码如下:
#include <iostream>
using namespace std;
int main()
{
int n,i;
int f1, f2, f3, fn;
while(cin>>n&&n!=0)
{
f1=1;
f2=2;
f3=3;
if(n==1)
cout<<f1<<endl;
else if(n==2)
cout<<f2<<endl;
else if(n==3)
cout<<f3<<endl;
else
{
for(i=4; i<=n; i++)
{
fn=f3+f1;
f1=f2;
f2=f3;
f3=fn;
}
cout<<fn<<endl;
}
}
return 0;
} 第九题
题意:
对一组数的绝对值从大到小进行排序,输出原数。
分析:
使用冒泡法进行比较,交换,
对一个数运用函数取绝对值进行排序,输出原数。
头文件#include<cmath>调用函数abs(x)
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{ int n,a[100],i,l,j;
while(cin>>n)
{ if(n==0)
continue;
else
{for(i=0;i<n;i++)
{ cin>>a[i]; }
for(i=0;i<n-1;i++)
{ l=i;
for(j=i+1;j<n;j++)
{if(abs(a[j])>abs(a[l]))
l=j;}
if(l!=i)
swap(a[i],a[l]); }
for(i=0;i<n;i++)
{if(i==n-1)
cout<<a[n-1];
else
cout<<a[i]<<" ";}}
cout<<endl;
}}
第十题
题意:
一组从大到小的有序数列中插入一个新数,依旧有序。
分析:
将新的数看做数组的最后一个元素,构成一个新的数组,
对新的数组进行排序,逆序排序,新增的数与原数组比较,交换。
原数组最后一个数是a[n-1],新的数是a[n];
a[j]与a[j+1]比较,可以全部比较。
代码如下:
#include<stdio.h>
int main() {
int i,j,k,m,n;
while(scanf("%d %d",&n,&m),n!=0||m!=0) {
int a[120];
for(i=0; i<n; i++)
scanf("%d",&a[i]);
a[n]=m;
for(j=n-1; j>=0; j--) {
if(a[j]>a[j+1]) {
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
} else
break;
}
for(i=0; i<=n; i++) {
if(i==0)
printf("%d",a[i]);
else
printf(" %d",a[i]);
}
printf("\n");
}
return 0;
}
第十二题
题意:
判断读入的字符串是否是回文串。
分析:
输入一个字符串,调用函数#include<cstring>
使用l=strlen(x)表示字符串的长度。
定义两个变量,i,j;i=0,j=l-1,
i++,j--,两个变量同时变化,缩小时间,
最后判断i和j的关系。
代码如下
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n,l,i,j;
char s[100];
cin>>n;
while(n--)
{
cin>>s;
l=strlen(s);
i=0,j=l-1;
while(i<j)
{
if(s[i]!=s[j])
{
break;
}
i++;
j--;
}
if(i>=j)
{
cout<<"yes"<<endl;
}
else
{
cout<<"no"<<endl;
}
}
return 0;
}
第十四题
题意:
给出两组数据,6个数,按照时间的规则相加,输出结果。
分析:
满60进1,小时没有限制,先对分钟进行相加,再对秒进行相加,满60,分钟加一,先对秒进行相加,分类情况较多,比较麻烦。
代码如下:
#include<iostream>
using namespace std;
int main()
{
int N,AH,AM,AS,BH,BM,BS,g,c,k;
cin>>N;
while(N--)
{
cin>>AH>>AM>>AS>>BH>>BM>>BS;
c=AH+BH;
if(AM+BM>=60)
{
c=c+1;
g=AM+BM-60;
}
else
{
g=AM+BM;
}
if(AS+BS>=60)
{
g=g+1;
k=AS+BS-60;
}
else
{
k=AS+BS;
}
cout<<c<<" "<<g<<" "<<k<<endl;
}
return 0;
}
第十三题:
题意:
将一个十进制的数转化为一个R进制的数。
分析:
根据进制之间转换的方法,循环相除,取余。
首先,处理数据,负数取负,转换为正数。
取余时,累加计数,逆序输出。
代码如下:
#include<stdio.h>
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");
}
}
第十五题
题意:
集合A-B所剩的元素。
分析:
输入A和B的元素,先找两个集合中相同的元素,将A中的元素记为—1,并计数K。
循环结束后,先判断K是否我0;是否为空集。
在输出时输出大于0的数。相同元素不被输出。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[101],b[101],i,j,m,n,k;
while (cin>>n>>m)
{
if(m==0&&n==0)
break;
for(i=0;i<n;i++)
cin>>a[i];
for(j=0;j<m;j++)
cin>>b[j];
k=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(a[i]==b[j]) {
k+=1;
a[i]=-1;
}
}
}
if(k==n)
cout<<"NULL";
else
{
sort(a,a+n);
for(i=0;i<n;i++)
{
if(a[i]>=0)
{
cout<<a[i]<<" ";
}
}
}
cout<<endl;
}return 0;
}
第十六题:
题意:
给出两个数A B,求A的B次方的最后三位数。
分析:
A的B次方可以看做B个A相乘。
要求输出最后三位数,取A/1000的余数。
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int A,B,a;
while(cin>>A>>B)
{
if(A==0&&B==0)
{
break;
}
a=1;
for(int i=1;i<=B;i++)
{
a=a*A%1000;
}
cout<<a;
cout<<endl;
}
return 0;
}
第十八题:
题意:
输入n个数,从1到m可以增加1,可以增加2,判断有几种增加方案。
分析:
采用递归算法,当m>=4的时候,m增加,可以选择的方案增加,关系为a[i]=a[i-1]+a[i-2]。
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,m,a[50],i;
cin>>n;
a[1]=0;
a[2]=1;
a[3]=2;
for(i=4;i<=40;i++)
{
a[i]=a[i-1]+a[i-2];
}
while(n--)
{
cin>>m;
cout<<a[m];
cout<<endl;
}
return 0;
}
第二十三题
题意:在一个区间内,去掉不吉利的数字,输出剩余的数字。
分析:
去掉含4或62的数,求出区间内数字的每一位是否为4,循环,依次除以10,连在一起的62,循环,n/100是否为62。依次除以10。两者满足其一即可。
采用循环的方法进行查找。
代码如下:
#include <iostream>
#include <cstring>
using namespace std;
int a[1000001]= {0};
int st(int n)
{
while(n)
{
if(n%10==4||n%100==62)
return 0;
n=n/10;
}
return 1;
}
int main()
{
int n,m,i;
for(i=1; i<1000001; i++)
{
a[i]=a[i-1]+st(i);
}
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
cout<<a[m]-a[n-1]<<endl;
}
return 0;
}
第一题
题意:
一个数减半后再减一,n次后,余1。
分析:
采用逆向思维,从最后的结果推出开始的结果。
余数加1再乘2。sum=(sum+1)*2。循环,经过n次,得出初始值。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int main ()
{
int n,i,sum;
while(cin>>n&&n!=0)
{
if(n==0)
break;
sum=1;
for(i=1;i<n;i++)
sum=(sum+1)*2;
printf("%d\n",sum);
}
return 0;
}
第五题:
题意:
将一个偶数拆成两个素数的和,输出其可能的结果个数。
分析:
通过循环,判断两个素数之和是否为要求的偶数。
并进行计数。
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,s,a[10000];
for(int i=3;i<=10000;i++)
{
a[i]=i;
}
for(int i=2;i<=10000;i++)
for(int j=2*i;j<=10000;j+=i)
{
a[j]=0;
}
while(scanf("%d",&n)!=EOF&&n)
{
s=0;
for(int i=3;i<n/2;i++)
{
if(a[i]+a[n-i]==n)
s++;
}
cout<<s<<endl;
}
return 0;
}
第六题
题意:
一个十进制的数分别用十二进制和十六进制表示,各个数字相加之和是否相等。
分析:
将十进制的数分别用十二进制和十六进制进行求余计算并相加,判断是否相等。
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,n1,n2,n3,n4,a,b,c,s1,s2,s3;
while(cin>>n)
{
n1=n2=n3=n4=n;
s1=0;s2=0;s3=0;
if(n==0)
break;
while(n1)
{
a=n1%10;
n1=n1/10;
s1+=a;
}
while(n2)
{
b=n2%12;
n2=n2/12;
s2+=b;
}
while(n3)
{
c=n3%16;
n3=n3/16;
s3+=c;
}
if(s1==s2&&s1==s3)
printf("%d is a Sky Number.\n",n4);
else
printf("%d is not a Sky Number.\n",n4);
}
return 0;
}
总结:
课程设计需要认真审题,明白输出内容,注意细节。
发散思维,采用逆序,计数,递归算法等使程序简单,
一些头文件,和函数的使用,使程序简洁。
循环时注意限制条件进行嵌套。