爱玩君 - PTA
type: channel
link: https://aiwanjun.com/tag/PTA/
items: PTA:求阶乘之和(递归版)(利用阶乘函数)
items: PTA:使用函数输出水仙花数
items: PTA:打印九九口诀表
items: PTA:换硬币
items: PTA:统计素数并求和
items: PTA:找出最小值
items: PTA:求分数序列前N项和
items: PTA:求奇数和
items: PTA:统计数字字符和空格

PTA:求阶乘之和(递归版)(利用阶乘函数)
type: item
date: 2021-09-06T00:28:00+08:00
description: 请编写函数，用递归方法求阶乘之和。SumFac(n)=0!+1!+2!+3+⋯+n!函数原型double SumFac(int x);说明：参数 x 为非负整数，函数值为 0 到 x 的阶乘之和。要求：利用前面作业中的阶乘函数 Fac 来计算阶乘。不要使用循环语句。裁判程序#include <stdio.h> double Fac(int x); double SumFac(int x); int main() { int n; scanf("%d", &n); printf("%.10g\n", SumFac(n)); return 0; } double Fac(int x) { ...(略)... } /* 你提交的代码将被嵌在这里 */输入样例4输出样例34测试样例输入样例输出样例01125154104037914701.215221118e+100关联习题：阶乘函数。实例代码double SumFac( int x ) { double sum; if(x>=0) { sum=SumFac(x-1)+Fac(x); } return sum; }

PTA:使用函数输出水仙花数
type: item
date: 2021-09-04T17:03:34+08:00
description: 水仙花数是指一个N位正整数（N≥3），它的每个位上的数字的N次幂之和等于它本身。例如：153=1^3+5^3+3^3。 本题要求编写两个函数，一个判断给定整数是否水仙花数，另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。函数接口定义int narcissistic( int number ); void PrintN( int m, int n );函数narcissistic判断number是否为水仙花数，是则返回1，否则返回0。函数PrintN则打印开区间(m, n)内所有的水仙花数，每个数字占一行。题目保证100≤m≤n≤10000。裁判测试程序样例：#include <stdio.h> int narcissistic( int number ); void PrintN( int m, int n ); int main() { int m, n; scanf("%d %d", &m, &n); if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m); PrintN(m, n); if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n); return 0; } /* 你的代码将被嵌在这里 */输入样例：153 400 输出样例：153 is a narcissistic number 370 371实例代码：int narcissistic( int number ){ int jia,i,l=0,g=0,sum=0; jia=number; while(jia){ //循环，当结果为0时停止 l++; jia=jia/10; } jia=number; for(i=0;i<l;i++){ g=pow(jia%10,l); sum+=g; jia=jia/10; } if(sum==number) return 1; else return 0; } void PrintN( int m, int n ){ int u=m+1; for(u;u<n;u++){ if(narcissistic(u)==1){ printf("%d\n",u); }else{} } }

PTA:打印九九口诀表
type: item
date: 2021-04-10T19:34:00+08:00
description: 下面是一个完整的下三角九九口诀表：1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81本题要求对任意给定的一位正整数N，输出从1*1到M*N的部分口诀表。输入格式：输入在一行中给出一个正整数N（1≤N≤9）。输出格式：输出下三角N*N部分口诀表，其中等号右边数字占4位、左对齐。输入样例：4 输出样例：1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 实例代码:#include <stdio.h> int main(void) { int i, j, n; scanf("%d", &n); for(i = 1; i <= n; i++) { for(j = 1; j <= i; j++) { printf("%d*%d=%-4d", j, i, i * j); } printf("\n"); } return 0; }

PTA:换硬币
type: item
date: 2021-04-10T12:38:15+08:00
description: 将一笔零钱换成5分、2分和1分的硬币，要求每种硬币至少有一枚，有几种不同的换法？输入格式:输入在一行中给出待换的零钱数额x∈(8,100)。输出格式:要求按5分、2分和1分硬币的数量依次从大到小的顺序，输出各种换法。每行输出一种换法，格式为：“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。输入样例:13 输出样例:fen5:2, fen2:1, fen1:1, total:4 fen5:1, fen2:3, fen1:2, total:6 fen5:1, fen2:2, fen1:4, total:7 fen5:1, fen2:1, fen1:6, total:8 count = 4实例代码:#include <stdio.h> int main(void){ int money,count=0,n5,n2,n1; scanf("%d",&money); for(n5=money/5;n5>=1;n5--){ for(n2=(money-n5*5)/2;n2>=1;n2--){ for(n1=money-n5*5-n2*2;n1>=1;n1--){ if((n5*5+n2*2+n1)==money){ printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",n5,n2,n1,n5+n2+n1); count++; } } } } printf("count = %d",count); return 0; }

PTA:统计素数并求和
type: item
date: 2021-04-10T12:36:12+08:00
description: 本题要求统计给定整数M和N区间内素数的个数并对它们求和。输入格式:输入在一行中给出两个正整数M和N（1≤M≤N≤500）。输出格式:在一行中顺序输出M和N区间内素数的个数以及它们的和，数字间以空格分隔。输入样例:10 31 输出样例:7 143实例代码:#include <stdio.h> #include <math.h> int main(void) { int m,n,flag,s,i,limit,sum=0,num=0; scanf("%d %d",&m,&n); for(s=m;s<=n;s++){ if(s<=1) flag=0; else if(s==2) flag=1; else{ flag=1; limit=sqrt(s)+1; for(i=2;i<=limit;i++){ if(s%i==0){ flag=0; break; } } } if(flag==1){ num++; sum=sum+s; } } printf("%d %d",num,sum); return 0; }

PTA:找出最小值
type: item
date: 2021-04-10T12:32:05+08:00
description: 本题要求编写程序，找出给定一系列整数中的最小值。输入格式：输入在一行中首先给出一个正整数n，之后是n个整数，其间以空格分隔。输出格式：在一行中按照“min = 最小值”的格式输出n个整数中的最小值。输入样例：4 -2 -123 100 0 输出样例：min = -123实例代码:#include <stdio.h> int main(void) { int i,n,mark,min; scanf("%d",&n); scanf("%d",&mark); min=mark; for(i=1;i<n;i++){ scanf("%d",&mark); if(min>mark) min=mark; } printf("min = %d",min); return 0; }

PTA:求分数序列前N项和
type: item
date: 2021-04-10T12:28:00+08:00
description: 本题要求编写程序，计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起，每一项的分子是前一项分子与分母的和，分母是前一项的分子。输入格式:输入在一行中给出一个正整数N。输出格式:在一行中输出部分和的值，精确到小数点后两位。题目保证计算结果不超过双精度范围。输入样例:20 输出样例:32.66实例代码:#include <stdio.h> int main(void){ int n,i; double m=1.0,z=2.0,k,su,sum=0; scanf("%d",&n); for(i=1;i<=n;i++){ su=z/m; k=m; m=z; z=k+z; sum=sum+su; } printf("%.2f",sum); return 0; }

PTA:求奇数和
type: item
date: 2021-03-22T11:34:00+08:00
description: 本题要求计算给定的一系列正整数中奇数的和。输入格式:输入在一行中给出一系列正整数，其间以空格分隔。当读到零或负整数时，表示输入结束，该数字不要处理。输出格式:在一行中输出正整数序列中奇数的和。输入样例:8 7 4 3 70 5 6 101 -1 输出样例:116实例代码:#include <stdio.h> int main(void) { int n,sum; sum=0; scanf("%d",&n); while(n>0){ if(n%2==1){ sum=sum+n; } scanf("%d",&n); } printf("%d",sum); return 0; }

PTA:统计数字字符和空格
type: item
date: 2021-03-22T11:26:00+08:00
description: 本题要求编写程序，输入一行字符，统计其中数字字符、空格和其他字符的个数。建议使用switch语句编写。输入格式:输入在一行中给出若干字符，最后一个回车表示输入结束，不算在内。输出格式:在一行内按照blank = 空格个数, digit = 数字字符个数, other = 其他字符个数 的格式输出。请注意，等号的左右各有一个空格，逗号后有一个空格。输入样例:在这里给出一组输入。例如：Reold 12 or 45T 输出样例:在这里给出相应的输出。例如：blank = 3, digit = 4, other = 8实例代码:#include <stdio.h> int main(void) { int b,d,o; b=d=o=0; char ch; while ((ch=getchar())!='\n') { switch(ch) { case ' ': b++; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': d++; break; default : o++; break; } } printf("blank = %d, digit = %d, other = %d",b,d,o); return 0; }