PTA函数答案.docx
《PTA函数答案.docx》由会员分享,可在线阅读,更多相关《PTA函数答案.docx(28页珍藏版)》请在冰豆网上搜索。
PTA函数答案
三、程序填空题
3-32程序阅读:
下列程序将输出
(5分)。
#include
ints;
intf(intm)
{
staticintk=0;
for(;k<=m;k++)s++;
returns;
}
intmain(void)
{
ints=1;
s=f
(2)+f
(2);
printf("%d#%d#",s,f(20));
return0;
}
四、函数
4-3 求m到n之和 (10分)
intsum(intm,intn)
{
inti;
ints=0;
for(i=m;i<=n;i++)
s=s+i;
return(s);
}
4-34 简单输出整数 (10分)
voidPrintN(intN)
{
inti;
for(i=1;i<=N;i++)
printf("%d\n",i);
}
4-36 简单求和 (10分)
intSum(intList[],intN)
{
intk;
intsum=0;
for(k=0;ksum+=List[k];
returnsum;
}
4-40 简单阶乘计算 (10分)
intFactorial(constintN)
{
inti;
ints=1;
if(N<0)
return0;
elseif(N==0)
return1;
else
for(i=1;i<=N;i++)
s*=i;
returns;
}
4-41 统计个位数字 (15分)
intCount_Digit(constintN,constintD)
{
intx;
intcount=0;
inttemp=0;
x=N;
if(x<0)
x=-x;
do
{
temp=x%10;
if(temp==D)
count++;
x=x/10;
}
while(x>0);
returncount;
}
4-43 找两个数中最大者 (10分)
intmax(inta,intb)
{
intmax;
if(a>=b)
max=a;
else
max=b;
returnmax;
}
4-44 数字金字塔 (15分)
voidpyramid(intn)
{
inti,j,space;
for(i=1;i<=n;i++)
{
space=n-i;
for(j=0;jputchar('');
for(j=0;j
printf("%-2d",i);
putchar('\n');
}
}
4-45 判断奇偶性 (10分)
inteven(intn)
{
if(n<0)
n=-n;
if(n%2==0)
return1;
else
return0;
}
4-46 使用函数求奇数和 (15分)
inteven(intn)
{
if(n<0)
n=-n;
if(n%2==0)
return1;
else
return0;
}
intOddSum(intList[],intN)
{
intk;
intoddsum=0;
for(k=0;kif(even(List[k])==0)
oddsum+=List[k];
returnoddsum;
}
4-47 使用函数计算两点间的距离 (10分)
doubledist(doublex1,doubley1,doublex2,doubley2)
{
doubleDist;
Dist=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
returnDist;
}
4-48 使用函数求素数和 (20分)
intprime(intp)
{
inti,j;
intcount=0;
for(j=2;j
{
if(p%j==0)
{
count++;
}
}
if(count==0&&p>0&&p!
=1)
{
return1;
}else{
return0;
}
}
intPrimeSum(intm,intn)
{
inti,sum=0;
for(i=m;i<=n;i++)
{
if(prime(i)==1)
{
sum=sum+i;
}
}
returnsum;
}
4-19 使用函数统计指定数字的个数 (15分)
intCountDigit(intnumber,intdigit)
{
intcount,temp,x;
x=number;
if(x<0)
x=-x;
do
{
temp=x%10;
if(temp==digit)
count++;
x=x/10;
}
while(x>0);
returncount;
}
4-20 使用函数输出水仙花数 (20分)
intnarcissistic(intnumber)
{
inti,j,digit,power,powerSum,integer,count,flag;
count=0;
integer=number;
while(integer>0)
{
integer=integer/10;
count++;
}
powerSum=0;
integer=number;
for(i=0;i{
digit=integer%10;
integer=integer/10;
power=1;
for(j=0;jpower=power*digit;
powerSum=powerSum+power;
}
if(powerSum==number)
flag=1;
else
flag=0;
returnflag;
}
voidPrintN(intm,intn)
{
inti;
for(i=m+1;i{
if(narcissistic(i)==1)
printf("%d\n",i);
}
}
4-21 使用函数求余弦函数的近似值 (15分)
doublefuncos(doublee,doublex)
{
doublesum=0,d=100;
inti=0,j;
doublecj;
intcount=0;
while(d>e)
{
count++;
if(count%2!
=0)
{
cj=1;
for(j=1;j<=i;j++)
cj=cj*j;
d=pow(x,i)/cj;
sum=sum+d;
i+=2;
}
else
{
cj=1;
for(j=1;j<=i;j++)
cj=cj*j;
d=pow(x,i)/cj;
sum=sum-d;
i+=2;
}
}
returnsum;
}
4-49 分类统计字符个数 (15分)
voidf(longintx,char*p)
{
charq;
staticinti=0,j=0;
if(x<0)
{
x=-x;
*p='-';
p++;
}
q=x%16;
if(q<10)
q=('0'+q);
else
q=('A'+q-10);
x=x/16;
j++;
i=j;
if(x>0)
f(x,p);
*(p+(i-j))=q;
j--;
}
4-7 使用函数求特殊a串数列和 (20分)
intfn(inta,intn)
{
intx;
intp=0;
inti;
for(i=0;i{
x=a*pow(10,i);
p=p+x;
}
returnp;
}
intSumA(inta,intn)
{
intk;
intsum=0;
for(k=0;ksum=sum+fn(a,k);
returnsum;
}
4-22 使用函数输出指定范围内的完数 (20分)
voidPrintPN(intm,intn)
{
intk;
intt;
intfound=0;
for(k=m;k<=n;k++)
{
if(factorsum(k)==k)
{
found=1;
printf("%d=1",k);
for(t=1;t<=k/2;t++)
if(t>1&&k%t==0)
printf("+%d",t);
printf("\n");
}
}
if(found==0)
printf("Noperfectnumber");
}
4-25 使用函数输出一个整数的逆序数 (20分)
intreverse(intnumber)
{
intm=0;
if(number<0)
{
number=-number;
printf("-");
}
elseif(number==0)
m=0;
while(number>0)
{
m=m*10+number%10;
number=number/10;
}
returnm;
}
4-50 移动字母 (10分)
voidShift(chars[])
{
inti;
intn;
chara[3];
n=strlen(s);
for(i=0;i<3;i++)
a[i]=s[i];
if(n>3)
for(i=3;i{
s[i-3]=s[i];
}
for(i=0;i<3;i++)
s[n-3+i]=a[i];
returns;
}
4-51 在数组中查找指定元素 (15分)
intsearch(intlist[],intn,intx)
{
inti,result;
for(i=0;i{
if(list[i]==x)
{
result=i;
break;
}
}
if(i==n)
result=-1;
returnresult;
}
4-52 数组循环右移 (20分)
intArrayShift(inta[],intn,intm)
{
inti=0;
ints[10];
if(m>=n)
m=m%n;
if(m!
=0)
{
for(i=n-m;is[i-(n-m)]=a[i];
for(i=n-m-1;i>=0;i--)
a[i+m]=a[i];
for(i=0;ia[i]=s[i];
}
return0;
}
注:
最后一个样例(2分),段错误没通过,暂时还没找到原因
4-54 删除字符 (20分)
voiddelchar(char*str,charc)
{
inti,j;
for(j=i=0;str[i]!
='\0';i++)
if(str[i]!
=c)
{
str[j]=str[i];
j++;
}
str[j]='\0';
}
4-55 分类统计各类字符个数 (15分)
voidStringCount(char*s)
{
inti,bletter=0,sletter=0,blank=0,digit=0,other=0;
for(i=0;s[i]!
='\0';i++)
{
if(s[i]>='A'&&s[i]<='Z')
bletter++;
elseif(s[i]>='a'&&s[i]<='z')
sletter++;
elseif(s[i]=='')
blank++;
elseif(s[i]>='0'&&s[i]<='9')
digit++;
else
other++;
}
printf("%d%d%d%d%d",bletter,sletter,blank,digit,other);
}
4-26 使用递归函数计算1到n之和 (10分)
intsum(intn)
{
inti;
intSum=0;
if(n<=0)
return0;
else
for(i=1;i<=n;i++)
Sum+=i;
returnSum;
}
4-28 递归求阶乘和 (15分)
doublefact(intn)
{
inti;
doublem=1;
if(n==0)
returnm;
else
for(i=1;i<=n;i++)
m=m*i;
returnm;
}
doublefactsum(intn)
{
intj;
doublesum;
sum=0;
if(n>0)
{
for(j=1;j<=n;j++)
sum+=fact(j);
}
returnsum;
}
4-29 递归实现指数函数 (15分)
doublecalc_pow(doublex,intn)
{
inti;
doublem=1;
for(i=1;i<=n;i++)
m=m*x;
returnm;
}
4-32 递归求Fabonacci数列 (10分)
intf(intn)
{
intd;
if(n==0)
d=0;
elseif(n==1)
d=1;
elsed=f(n-2)+f(n-1);
returnd;
}
4-33 十进制转换二进制 (15分)
voiddectobin(intn)
{
intt;
if(n==0||n==1)
printf("%d",n%2);
else
{
t=n;
dectobin(n=n/2);
printf("%d",t%2);
}
}
4-8 递归实现顺序输出整数 (15分)
voidprintdigits(intn)
{
intN=1;
inti;
intshang;
intyushu;
intm;
m=n;
while(m>9)
{
N++;
m=m/10;
}
for(i=N-1;i>=0;i--)
{
shang=n*pow(10,-i);
yushu=n-shang*pow(10,i);
n=yushu;
printf("%d\n",shang);
}
}
4-9 统计各位数字之和是5的数 (20分)
intis(intnumber)
{
ints=0;
intyushu=number;
while(number>0)
{
yushu=number%10;
s=yushu+s;
number=number/10;
}
if(s==5)
return1;
else
return0;
}
voidcount_sum(inta,intb)
{
inti;
intcount=0;
intcount_Sum=0;
for(i=a;i<=b;i++)
if(is(i))
{
count++;
count_Sum=count_Sum+i;
}
printf("count=%d,sum=%d",count,count_Sum);
}
4-10 简单实现x的n次方 (10分)
doublemypow(doublex,intn)
{
inti;
doubles=1;
for(i=0;is=s*x;
returns;
}
4-13 使用函数求1到10的阶乘和 (10分)
doublefact(intn)
{
intk;
ints=1;
for(k=1;k<=n;k++)
s=s*k;
returns;
}
4-14 使用函数求最大公约数 (10分)
intgcd(intx,inty)
{
inti,t;
if(x{
t=y;
y=x;
x=t;
}
for(i=y;i>=1;i--)
if(x%i==0&&y%i==0)
break;
returni;
}
4-15 使用函数的选择法排序 (25分)
voidsort(inta[],intn)
{
inttemp,k,min,i;
for(k=0;k{
min=k;
for(i=k+1;iif(a[i]min=i;
temp=a[min];
a[min]=a[k];
a[k]=temp;
}
}
4-16 函数实现字符串逆序 (15分)
voidf(char*p)
{
chartemp;
char*end=p+my_strlen(p)-1;
while(end>p)
{
temp=*p;
*p=*end;
*end=temp;
--end;
++p;
}
}
intmy_strlen(char*p)
{
char*q=p;
while(*p!
='\0')
p++;
returnp-q;
}
4-17 递归计算P函数 (15分)
doubleP(intn,doublex)
{
doublez;
if(n==0)
z=1;
elseif(n==1)
z=x;
elseif(n>1)
z=((2*n-1)*P(n-1,x)-(n-1)*P(n-2,x))/n;
returnz;
}
4-1 计算存款利息-genlib (10分)
intmain(void)
{
intmoney,year;
doubleinterest,rate;
scanf("%d",&money);
scanf("%d",&year);
scanf("%lf",&rate);
interest=money*pow(1+rate,year)-money;
printf("interest=%.2f\n",interest);
return0;
}
4-2 弹球距离 (15分)
doubledist(doubleh,doublep)
{
doubled=h;
while(p!
=0)
{
h=p*h;
if(hbreak;
d=d+2*h;
}
return(d);