5,有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。问在第n年的时候,共有多少头母牛?
输入:数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
输出:对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
分析:第一年有一头母牛和一头小母牛,第二年还是这一头母牛并且又生了一头小母牛,第三年有两头母牛一头是开始的一头,另一头是年末第一年母牛下的那一头小牛长大可以在第四年下小牛了。以此第四年有三头母牛第三年的两头加上第二年出生的小牛。以此类推可以用斐波那契递推公式可以观察到从第四年开始满足f(n)=f(n-1)+f(n-3)
注意:斐波那契数列的使用要用long long int来定义否则数过大数组会放不下.
源代码如下:
#include<iostream>
using namespace std;
int main()
{
int n,I;
long long f[100]={0,1,2,3};//*进行初始化.
while(cin>>n)
{
if(n!=0)
{ for(i=4;i<n+4;i++)
{
f[i]=f[i-1]+f[i-3];
}
cout<<f[n]<<endl;
}
if(n==0)
break;
}
return 0;
}
6,方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).
若给出A0, An+1, 和 C1, C2, .....Cn.
请编程计算A1 = ?
输入:包括多个测试实例。对于每个实例,首先是一个正整数n,(n <= 3000); 然后是2个数a0, an+1.接下来的n行每行有一个数ci(i = 1, ....n);输入以文件结束符结束。
输出:对于每个测试实例,用一行输出所求得的a1(保留2位小数).
分析:A1+A1=A0+A2-2C1
A1+A2=A0+A3-2(C1+C2)
A1+A3=A0+A4-2(C1+C2+C3)
A1+A4=A0+A5-2 (C1+C2+C3+C4)
……
A1+An=A0+An+1-2(C1+C2+C3+……Cn)
两边进行求和则:A1=[nA0+An+1-2(nC1+(N-1)C2+……2Cn-1+Cn)]/(n+1)
注意保留两位小数
源代码如下:
#include<stdio.h>
int main()
{
double a0,an1,c[3300],sum;
int n,i;
while(scanf("%d",&n)!=EOF)
{
scanf("%lf %lf",&a0,&an1);
sum=0;
for(i=1;i<=n;i++)
{
scanf("%lf",&c[i]);
sum+=(n-i+1)*c[i];//按照规律求和
}
sum=(double)((n*a0+an1-2*sum))/(n+1);//最后求出A1的值.注意强制转换的使用
printf("%.2lf\n",sum);
}
return 0;
}
7,不吉利的数字为所有含有4或62的号码。例如:
62315 ,73418, 88914,
都属于不吉利号码。但是,61152虽然含有6和2,6和2不连号,所以不属于不吉利数字之列。
对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
输入:都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。
输出:对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。
分析:不含有4,6和2不连在一起,将吉利数的个数求出来,如果要求n~m之间的吉利数的个数,就用在m时的吉利数的个数减去在n-1时的吉利数的个数就是在n~m之间的吉利数的个数。
源代码如下:
#include<stdio.h>
int a[1000001]={0};
int zhao(int n)
{
while(n>0)
{
if(n%10==4||n%100==62)//判断每个数是否含有4和62.
return 0;
n/=10;
}
return 1;
}
int main()
{
int n,m,i;
for(i=1;i<1000001;i++)
a[i]=a[i-1]+zhao(i);
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
else printf("%d\n",a[m]-a[n-1]);
}
return 0;
}
8,“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。判断读入的字符串是否是“回文”。
输入:包含多个测试实例,输入数据的第一行是一个正整数n,表示测试实例的个数,后面紧跟着是n个字符串。
输出:如果一个字符串是回文串,则输出"yes",否则输出"no"
分析:从后往前,从前往后对应相等直到i=len,如果对应不相等则不是回文串。
以下是源代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
char str[110];
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",str);
int len=strlen(str)-1;//除去“\0”的长度。
bool m=true;
for(int i=0;i<=len;i++,len--)
{
if(str[i]!=str[len])
{
m=false;//如果对应不相等,则不是回文串。
}
}
if(m==true)
printf("yes\n");
else
printf("no\n");
}
}
9,输入一个十进制数N,将它转换成R进制数输出。
输入:数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
输出:为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
分析:
#include<stdio.h>
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--)//对于(r>10)处理,参考十六进制。
{
switch(a[j])
{
case 10:printf("A");break;
case 11:printf("B");break;
case 12:printf("C");break;
case 13:printf("D");break;
case 14:printf("E");break;
case 15:printf("F");break;
default :printf("%d",a[j]);
}
}
printf("\n");
}
}
10,空心三角形;
每行包含一个字符和一个整数n(0<n<41),不同的字符表示不同的花纹,整数n表示等腰三角形的高。显然其底边长为2n-1。如果遇到@字符,则表示所做出来的样板三角形已经够了。
每个样板三角形之间应空上一行,三角形的中间为空。显然行末没有多余的空格。
Sample Input
X 2
A 7
@
Sample Output
X
XXX
A
A A
A A
A A
A A
A A
AAAAAAAAAAAAA
分析:在对行处理时可以分为三部分进行处理,第一行最后一行以及从第二行到倒数第二行,每行的“第一个和最后一个”输出字符,
#include <iostream>
using namespace std;
int main()
{
char ch;
int n,flag=0;//flag用来判断是否为第一个三角形
while(cin>>ch)
{
if(ch=='@') break;
cin>>n;
if(flag)
cout<<endl;
flag=1;
if(n==1)
{
cout<<ch<<endl;
continue;
}
for(int i=1;i<n;i++) cout<<" ";
cout<<ch<<endl;
for(int i=2;i<n;i++)
{
for(int j=1;j<=n-i;j++) cout<<" ";
cout<<ch;
for(int j=1;j<=2*i-3;j++) cout<<" ";
cout<<ch<<endl;
}
if(n!=1)
{
for(int i=1;i<=2*n-1;i++)//对最后一行进行处理。
cout<<ch;
cout<<endl;
}
}
return 0;
}