PTA实验4
在前⾯我要说⼀下,我写的时候是在VS2017上写的,有些代码可能需要读者⾃⼰改⼀下(我尽量不出现这样的错误吧),另外我也是边写边改,上⾯有很多注释掉的是草稿,(emmmm就是因为我太菜了所以要弄成这样)当然,这些程序放PTA上⾯肯定是可以过的(如有例外还请读者⼤⽼爷提出意见和建议,留⾔)
欢迎交流试题答案(如有我未写到的可以补充噢,我会注明提供源的)
7-1 【C0139】输出所有的⽔仙花数 (10分)
若⼀个三位数等于其各位上数字的⽴⽅和,则称这个三位数为⽔仙花数。编写⼀个程序,输出所有的⽔仙花数。
输⼊格式:
⽆输⼊
输出格式:
按照从⼩到⼤的顺序输出所有⽔仙花数,⼀⾏输出⼀个数。
输⼊样例:
在这⾥给出⼀组输⼊。例如:
输出样例:
在这⾥给出相应的输出。例如:
153
370
371
407
#include<stdio.h>
#include<math.h>
int main()
{
int i, g, s, b, sum;
for(i =100; i <=999; i++)
{      g = i %10;//取个位数
s =(i /10)%10;//取⼗位数
b = i /100;//取百位数
sum =pow(g,3)+pow(s,3)+pow(b,3);//求和
if(i == sum)
{printf("%d\n", i);}
}
return0;}
7-2 【C0140】输⼊两个整数,⽤辗转相除法计算其最⼤公约数和最⼩公倍数 (10分)
编写⼀个程序,输⼊两个整数,⽤辗转相除法计算其最⼤公约数和最⼩公倍数。
输⼊格式:
在⼀⾏中输⼊两个以逗号为间隔的整数。
输出格式:
以逗号为间隔输出这两个整数的最⼤公约数和最⼩公倍数。
输⼊样例:
在这⾥给出⼀组输⼊。例如:
24,36
输出样例:
在这⾥给出相应的输出。例如:
12,72
#include"stdio.h"
#include"math.h"
int main()
{
int a, b,c,A,B;
scanf("%d,%d",&a,&b);
A = a;
B = b;//保留原数值
if(a <= b)
{a = a; b = b;}
else
{c = a; a = b; b = c;}
while(a>0)
{
c = b % a;
b = a; a = c;
}
printf("%d,%d", b, A*B / b);
return0;
}
7-3 【C0141】计算阶乘和 (10分)
编写⼀个程序,计算s=1!+2!+3!+…+n!。其中!为阶乘运算,n由输⼊决定。
输⼊格式:
输⼊正整数n。
输出格式:
输出1!+2!+3!+…+n!的值。
输⼊样例:
在这⾥给出⼀组输⼊。例如:
3
输出样例:
在这⾥给出相应的输出。例如:
9
#include"stdio.h"
#include"math.h"
int main()
{int i,m,n,sum1,sum2;//sum1是总和,sum2是对应i的阶乘,m是过渡值
sum1 =0;  sum2 =1;
scanf("%d",&n);
for(int i =1; i <= n; i++)
{//printf("i=%d\n", i);草稿
for(int m =1; m <=i; m++)
{//printf("m=%d\n", m);草稿
sum2 = sum2 * m;
/
/printf("sum2=%d\n", sum2 );草稿
}
sum1 = sum1 + sum2;//把对应i的阶乘加到sum1上
sum2 =1;//sum2的值回归
//printf("sum1=%d\n", sum1) ;草稿
}
printf("%d\n", sum1);
return0;}
7-4 【C0142】计算数列和 (10分)
编写⼀个程序,计算
其中m由输出决定。
输⼊格式:
输⼊正整数m。
输出格式:
计算
并输出。
输⼊样例:
在这⾥给出⼀组输⼊。例如:
3
输出样例:
在这⾥给出相应的输出。例如:
0.833333
#include"stdio.h"
#include"math.h"
int main()
{
int m;
float n, sum;
sum =0;//printf("输⼊m的值,m=");
scanf("%d",&m);
//printf("\ni为项数");
//printf("\n下⾯开始求和了,注意,奇数项为正,偶数项为负");
for(int i =1; i <= m; i++)
{//printf("\ni=%d",i);
n =1/(float)i;
if(i %2==0)
{            n =-n;}
else if(i %2==1)
{            n = n;}
//printf("\nn=%f", n);
sum = sum + n;
//printf("\nsum=%f", sum);
}
//printf("\nsum=%f", sum);
printf("%f", sum);
return0;}
7-5 求整数的位数及各位数字之和 (15分)
对于给定的正整数N,求它的位数及其各位数字之和。
输⼊格式:
输⼊在⼀⾏中给出⼀个不超过109的正整数N。
输出格式:
在⼀⾏中输出N的位数及其各位数字之和,中间⽤⼀个空格隔开。
输⼊样例:
321
输出样例:
3 6
{int N,a,b;    b =0;
//printf("须知,N为输⼊的数,a为它的位数,b为它各个位上数的和,c,d为中间过渡值/n输⼊⼀个不⼤于10^9的数字\nN=");
scanf("%d",&N);
2024 2028 2032奥运会//printf("\n下⾯求N的位数a");
a =1+log10(N);//这就是位数了
//printf("\na=%d", a);
//printf("\n下⾯求N的各个位上数的和b");
for(int i =1; i <= a; i++)
{int c,d;
c =pow(10, i-1);
d =(N / c)%10;
b += d;
//printf("\nc=%d,d=%d,b=%d", c, d,b);
}
printf("%d %d", a, b);
return0;
}
7-6 单词长度 (15分)
你的程序要读⼊⼀⾏⽂本,其中以空格分隔为若⼲个单词,以.结束。你要输出每个单词的长度。这⾥的单词与语⾔⽆关,可以包括各种符号,⽐如it’s算⼀个单词,长度为4。注意,⾏中可能出现连续的空格;最后的.不计算在内。
输⼊格式:
输⼊在⼀⾏中给出⼀⾏⽂本,以.结束
提⽰:⽤scanf("%c",…);来读⼊⼀个字符,直到读到.为⽌。
输出格式:
在⼀⾏中输出这⾏⽂本对应的单词的长度,每个长度之间以空格隔开,⾏末没有最后的空格。
输⼊样例:
It’s great to see you here.
输出样例:
4 5 2 3 3 4
我这⾥写的有⼀些问题,就是“.”这个结束标识前⾯如果是空格的话,它会在最后码上⼀个空格,这就跟要求的输出不符合,希望评论指点⼀下。
{
int i,n =0,m;//m,n是储存单词长度的,作⽤不⼀样
char ch[100];
gets(ch);
for(int i =0; ch[i]!='.'; i++)
{
//printf("i=%d\n", i);
if(ch[i]!=' ')
{
n++;
//printf("**n=%d\n", n);
}
else if(ch[i]==' ')
{
if(n==0)
{
continue;//连续空格情况,避免误认为单词
}
m = n;
n =0;/*⼀个单词输完了,n回归*/
//printf("****m=%d,n=%d\n", m,n);
printf("%d", m);
}
}
if(n ==0)//最后的倔强
{
return0;
}
if(n !=0)
{printf("%d", n);return0;}
}
7-7 输出闰年 (15分)
输出21世纪中截⽌某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。输
⼊格式:
输⼊在⼀⾏中给出21世纪的某个截⽌年份。
输出格式:
逐⾏输出满⾜条件的所有闰年年份,即每个年份占⼀⾏。输⼊若⾮21世纪的年份则输出"Invalid year!"。若不存在任何闰年,则输
出“None”。
输⼊样例1:
2048