PTA程序设计答案.docx
《PTA程序设计答案.docx》由会员分享,可在线阅读,更多相关《PTA程序设计答案.docx(70页珍藏版)》请在冰豆网上搜索。
PTA程序设计答案
PTA所有答案
工业gc1601学习小组
、判断题
、选择题
三、函数题
4-3求m到n之和(10分)答案:
intsum(intm,intn){ints=0,i;for(i=m;i<=n;i++)s+=i;
returns;
}4-34简单输出整数(10分)答案:
voidPrintN(intN){inti;
for(i=1;i<=N;i++)printf("%d\n",i);
}
4-36简单求和(10分)答案:
intSum(intList[],intN){inti,s=0;
for(i=0;is+=List[i];
returns;
}
4-40简单阶乘计算(10分)
答案:
intFactorial(constintN){
inti,s=1;
if(N<0)return0;
elseif(N==0)
return1;
else{for(i=1;i<=N;i++)
s*=i;returns;
}
}
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;jfor(j=0;j
printf("%-2d",i);printf("\n”);
}
}
4-45判断奇偶性(10分)
答案:
inteven(intn){if(n%2==0)return1;
else
return0;
}
4-46使用函数求奇数和(15分)答案:
inteven(intn){
if(n%2==0)return1;
else
return0;
}
intOddSum(intList[],intN){
inti;
intoddsum=0;
for(i=0;i}
4-47使用函数计算两点间的距离(10分)答案:
doubledist(doublex1,doubley1,doublex2,doubley2){doubled;
d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));returnd;
}4-48使用函数求素数和(20分)答案:
intprime(intp){
inti,j,count=0;
for(j=2;j
if(count==0&&p>0&&p!
=1)
return1;
else
return0;
}
intPrimeSum(intm,intn){
inti,sum=O;
for(i=m;i<=n;i++)
if(prime(i)==1)sum=sum+i;
returnsum;
}
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;idigit=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;iif(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分)答案:
voidStringCount(chars[]){
inti;
intn1=0,n2=0,n3=0,n4=0;
for(i=0;s[i]!
='\0';i++){
if((s[i]>='a'&&s[i]<='z')||(s[i]>=A&&s[i]<='Z'))n1++;
elseif(s[i]==''||s[i]=='\n')
n2++;
elseif(s[i]>='O'&&s[i]<=9)
n3++;
elsen4++;
}
printf("letter=%d,blank=%d,digit=%d,other=%d",n1,n2,n3,n4);}
4-7使用函数求特殊a串数列和(20分)
答案:
intfn(inta,intn){
intx,p=0,i;
for(i=0;ix=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分)
答案:
intfactorsum(intnumber){
inti,s=1;
for(i=1;i<=number/2;i++)
if(i>1&&number%i==0)
s+=i;
returns;
}
voidPrintPN(intm,intn){
intk,t,found=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,n;
chara[3];n=strlen(s);
for(i=0;i<3;i++)a[i]=s[i];
if(n>3)for(i=3;ifor(i=0;i<3;i++)s[n-3+i]=a[i];
}
4-51在数组中查找指定元素(15分)
答案:
intsearch(intlist[],intn,intx){inti,result;
for(i=0;i}
}
if(i==n)
result=-1;
returnresult;
}
4-52数组循环右移(20分)
答案:
intArrayShift(inta[],intn,intm){inti=0,s[100];
if(m>=n)m=m%n;
if(m!
=0){
for(i=n-m;ifor(i=n-m-1;i>=0;i--)
a[i+m]=a[i];
for(i=0;i}return0;
}4-54删除字符(20分)
答案:
voiddelchar(char*str,charc){inti=0,j=0;
for(;str[i]!
='\0';i++)if(str[i]!
=c){str[j]=str[i];j++;
}
str[j]='\O:
}
4-55分类统计各类字符个数(15分)
答案:
voidStringCount(char*s){
inti;
intn1=0,n2=0,n3=0,n4=0,n5=0;
for(i=0;s[i]!
='\0';i++){
if(s[i]>=A&&s[i]<='Z')
n1++;
elseif(s[i]>='a'&&s[i]<='z')
n2++;
elseif(s[i]=='')
n3++;
elseif(s[i]>='0'&&s[i]<=9)
n4++;
elsen5++;
}
printf("%d%d%d%d%d",n1,n2,n3,n4,n5);
}
4-26使用递归函数计算1到n之和(10分)
答案:
intsum(intn){
inti,sum=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=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){
if(n<10)
printf("%d\n",n);
else{
printdigits(n/10);
printf("%d\n",n%10);
}
}
4-9统计各位数字之和是5的数(20分)答案:
intis(intnumber){
ints=0;
while(number>0){
s+=number%10;number/=10;
}
if(s==5)return1;
elsereturn0;
}
voidcount_sum(inta,intb){
inti,count=0,count_sum=0;for(i=a;i<=b;i++)if(is(i)){
count++;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){
inti;doubles=1;
for(i=1;i<=n;i++)s=s*i;
returns;
}
4-14使用函数求最大公约数(10分)答案:
intgcd(intx,inty){
inti,t;
if(x}for(i=y;i>=1;i--)
if(x%i==0&&y%i==0)break;
returni;
}
4-15使用函数的选择法排序(25分)
答案:
voidsort(inta[],intn){inti,j,k,t;
for(i=0;i}
}
}
4-16函数实现字符串逆序(15分)答案:
voidf(char*p){
inti,n=0;
chart;
for(i=0;p[i]!
='\0:
i++)n++;
for(i=0;iP[i]=P[n-1-i];p[n-1-i]=t;
}
}
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;return乙
}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;
}returnd;
}
四、编程题
单词长度(20分)
答案:
#include<>
#include<>
intmain(){
chara[1000];
inti,n=0,k,t=0;for(i=0;;i++){
scanf("%c",&a[i]);if(a[i]=='.')break;
}
k=i;
for(i=i-1;i>=0;i--){if(a[i]=='')t++;
elsebreak;
}
for(i=0;i<=k;i++){
if(a[i]=='•'){
if(n!
=0){
printf("%d",n);printf("\n");
}
break;
if(a[i]==''){
if(n!
=0){
printf("%d",n);
n=0;
if(iprintf(”");
else{
n++;
return0;
掉入陷阱的数字(20分)答案:
#include<>
intmain(){
intn[1000],s[1000],i,t;scanf("%d",&n[0]);
for(i=1;i<1000;i++){s[i-1]=0;
t=n[i-1];while(t>0){
s[i-1]+=t%10;t/=10;
}
n[i]=3*s[i-1]+1;printf("%d:
%d\n",i,n[i]);if(n[i]==n[i-1])break;
}
return0;
}
答案:
#include<>#include<>intmain(){
char*key[10]={"0","1,.?
!
","2ABC","3DEF","4GHI","5JKL","6MN0",
"7PQRS","8TUV","9WXYZ"
};
intlength[10];
for(inti=0;i<10;i++){
length[i]=strlen(key[i]);
}
charch;
charp;
intcount=0;
do{
ch=getchar();
if(ch!
=''&&ch!
='\n'){
p=ch;
count++;
}
else{
putchar(key[p-'0'][(count-1)%length[p-'0']]);count=0;
}
}while(ch!
='\n');
return0;
}
算术入门之加减乘除(20分)
答案:
#include<>
main(){
inta,b,r1,r2,r3,r41,c;
floatr42;
scanf("%d%d",&a,&b);
r1=a+b;
r2=a-b;
r3=a*b;
printf("%d+%d=%d\n%d-%d=%d\n%d*%d=%d\n",a,b,r1,a,b,r2,a,b,
⑶;
c=a%b;
if(c==0){
r41=a/b;
printf("%d/%d=%d",a,b,r41);
}
else{
r42=(float)a/b;
printf("%d/%d=%.2f",a,b,r42);
}return0;
}
人民币兑换(20分)答案:
#include<>
main(){
intn,n5,n2,n1;
scanf("%d",&n);
for(n5=1;n5<=n;n5++){
for(n2=100-n5;n2>=0;n2--){n1=100-n5-n2;
if(5*n5+2*n2+n1==150)
printf("%d%d%d\n",n5,n2,n1);}
}
return0;
}
求n以内最大的k个素数以及它们的和(20分)答案:
#include<>
intfun(intx){
inti;
if(x==0||x==1)return0;if(x==2)return1;
for(i=2;i*i<=x;i++)if(x%i==0)return0;
return1;
}
main(){
intn,k,s=0,t=1,j;
scanf("%d%d",&n,&k);
for(j=n;j>=1;j--){
if(fun(j)){
if(t){printf("%d",j);t=0;
}
else
printf("+%d",j);
s+=j;k--;
}
if(k==0)break;
}
printf("=%d",s);
return0;
}
编程打印空心字符菱形(20分)
答案:
#include<>
main(){
charch;
intj,j1,i,k,t;
scanf("%c%d",&ch,