PTA考试前笔记

打字不易,若有帮助请为我点个赞吧

素数是重点

还有辗转相除法

7-15 N个数求和

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24
#include <stdio.h>
#include <math.h>
int gcd(int a, int b)
{
	int c, m, n;
	m = fmax(a, b);
	n = fmin(a, b);
	while (n != 0)
	{
		c = m % n;
		m = n;
		n = c;
	}
	return m;
}
int main()
{
	int n, i;
	long long a, b, c, d, m1, m2, p;
	scanf("%d", &n);
	scanf("%lld/%lld", &a, &b);
	p = gcd(a, b);
	a /= p;
	b /= p;
	while (--n)
	{
		scanf("%lld/%lld", &c, &d);
		m1 = a * d + c * b;
		m2 = b * d;
        p=gcd(m1,m2);
		m1 /= p;
		m2 /= p;
		a = m1;
		b = m2;
	}
	p = gcd(a, b);
	a /= p;
	b /= p;
	if (a % b == 0)
		printf("%lld", a / b);
	else if (a / b == 0 && a != 0 && b != 0)
		printf("%lld/%lld", a , b);
	else
		printf("%lld %lld/%lld", a / b, a % b, b);
	return 0;
}

 7-16 念数字

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu

输入格式:

输入在一行中给出一个整数,如:1234

提示:整数包括负数、零和正数。

输出格式:

在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si

输入样例:

-600

输出样例:

fu liu ling ling
#include <stdio.h>
int count(int x)
{
	int cnt = 1;
	while (x > 9)
	{
		x /= 10;
		cnt *= 10;
	}
	return cnt;
}
int main()
{
	int n;
	scanf("%d", &n);
	int c;
	if (n < 0)
	{
		printf("fu ");
		n = -n;
	}
	c = count(n);
	for (int i = 0; c > 0; i++)
	{
		int m;
		m = n / c;
		n %= c;
		switch (m)
	{
	case 0:
		printf("ling");
		break;
	case 1:
		printf("yi");
		break;
	case 2:
		printf("er");
		break;
	case 3:
		printf("san");
		break;
	case 4:
		printf("si");
		break;
	case 5:
		printf("wu");
		break;
	case 6:
		printf("liu");
		break;
	case 7:
		printf("qi");
		break;
	case 8:
		printf("ba");
		break;
	case 9:
		printf("jiu");
		break;
	}
	if (c > 9)
	{
		printf(" ");
	}
	c /= 10;
	}
	return 0;
	
}

7-17 最大公约数和最小公倍数

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:

输入在一行中给出两个正整数M和N(≤1000)。

输出格式:

在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:

511 292

输出样例:

73 2044
#include <stdio.h>
int main()
{
	int m, n;
	int gongyue, gongbei;
	scanf("%d %d", &m, &n);
	int flag;
	if (m > n) flag = m;
	else flag = n;
	for (int i = 1; i <= flag; i++)
	{
		if (m % i == 0 && n % i == 0)
			gongyue = i;
	}
	gongbei = m * n / gongyue;
	printf("%d %d", gongyue, gongbei);
	return 0;
}

 7-26 sdut-C语言实验-数列求和

数列求和是一类常见的问题,本题有一定的代表性:
求s=a+aa+aaa+aaaa+……+aa…aa(n位)
其中,a的值由键盘输入,位数n也由键盘输入。

输入格式:

第一行输入a的值;
第二行输入位数n。

输出格式:

输出对n个数完成求和运算后的结果。
比如a=3,n=6时,s=3+33+333+3333+33333+333333

输入样例:

3
6

输出样例:

在这里给出相应的输出。例如:

370368
#include <stdio.h>
#include <math.h>
int main()
{
	int S=0, a, n, b=0,sum=0;
	scanf("%d\n%d", &a, &n);
	for (int i = 1; i <= n; i++)
	{
		b = (int)pow(10, i-1);
		S = S + a * b;
        sum+=S;
	}
	printf("%d", sum);
	return 0;
}

7-27 求Fibonacci(斐波那契)数列的n项和

已知斐波那契数列有如下特点:第1,2两个数为1,1。从第三个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13,……。本题要求编写程序,计算该数列的前n项和。

输入格式:

键盘输入n(2≤n≤40)。

输出格式:

sum=S,S为斐波那契数列的前n项和。

输入样例:

10

输出样例:

sum=143

#include <stdio.h>
int main()
{
	int n, i, a1=1, a2=1, t, sum=2;
	scanf("%d", &n);
	for (i = 3; i <= n; i++)
	{
		t = a1 + a2;
		sum += t;
		a1 = a2;
		a2 = t;
	}
	printf("sum=%d", sum);
	return 0;
}

7-29 sdut- C语言实验-判断素数(循环结构)

从键盘上输入任意一个正整数,然后判断该数是否为素数。
如果是素数则输出"This is a prime."
否则输出“This is not a prime.”

输入格式:

输入任意一个正整数n(1 <= n <= 1000000)。

输出格式:

判断n是否为素数,并输出判断结果:
如果n是素数则输出"This is a prime."
否则输出“This is not a prime.”

特别提醒:请注意对1的判定,1不是素数。

输入样例:

3

输出样例:

在这里给出相应的输出。例如:

This is a prime.
#include <stdio.h>
int main()
{
	int n, flag = 1, a;
	scanf("%d", &n);
	for (int i = 2; i <= n-1; i++)
	{
		a = n % i;
		if (a == 0)
        {
            flag=0;
        }
	}
	if (n == 1) flag = 0;
	if (flag == 1) printf("This is a prime.");
	if (flag == 0) printf("This is not a prime.");
	return 0;
}

7-30 sdut-C语言实验- 求绝对值最大值

求n个整数中的绝对值最大的数(要求n个数的绝对值不相等)。

输入格式:

输入数据有2行,第一行为n,第二行是n个整数。

输出格式:

输出n个整数中绝对值最大的数。

输入样例:

在这里给出一组输入。例如:

5
-1 2 3 4 -5

输出样例:

在这里给出相应的输出。例如:

-5
#include <stdio.h>
int main()
{
	int n, a, b, max,Max;
	scanf("%d\n", &n);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &a);
		if (a < 0) b = -a;
		else b = a;
		if (b > Max) max = a;
        Max=b;
	}
	printf("%d", max);
	return 0;
}

 7-35 sdut-C语言实验-完美的素数

素数又称质数。指一个大于1的自然数,除了1和此整数自身外,不能被其他自然数整除的数。我们定义:如果一个素数是完美的素数,当且仅当它的每一位数字之和也是一个素数。现在给你一个正整数,你需要写个程序判断一下这个数按照上面的定义是不是一个完美的素数。

输入格式:

输入包含多组测试数据。
每组测试数据只包含一个正整数 n (1 < n <= 10^6)。

输出格式:

对于每组测试数据,如果 n 是完美的素数,输出“YES”,否则输出“NO”(输出均不含引号)。

输入样例:

在这里给出一组输入。例如:

11
13

输出样例:

在这里给出相应的输出。例如:

YES
NO
#include <stdio.h>
int main()
{
	int n;
	int a, flag=1;
	int b, j , c;
	while (scanf("%d", &n) != EOF)
	{
		for (int i = 2; i <= n; i++)
		{
			
			a = n % i;
			if (a == 0)
			{
				break;
			}
			
			b = n;
			while (b != 0)
			{
				c = b % 10;
				b /= 10;
				for (j = 2; j < c; j++)
				{
					if (c % j != 0)
					{
						flag = 0;
						break;
					}
                    
				}
				
			}
			
		}
		if (flag == 1) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

7-37 sdut-C语言实验-求某个范围内的所有素数

求小于n的所有素数,按照每行10个显示出来。

输入格式:

输入整数n(n<10000)。

输出格式:

每行10个依次输出n以内(不包括n)的所有素数。如果一行有10个素数,每个素数后面都有一个空格,包括每行最后一个素数。

输入样例:

100

输出样例:

2 3 5 7 11 13 17 19 23 29 
31 37 41 43 47 53 59 61 67 71 
73 79 83 89 97 
#include <stdio.h>
int main()
{
	int i,j,n,k=0;
	scanf("%d", &n);
	for ( i = 2; i <= n; i++)
	{
		if (i == 2)
		{
			printf("%d ", i);
			k++;
		}
		else
		{
			for (j = 2; j < i; j++)
			{
				if (i % j == 0)
				{
					break;
				}
            }
				
				if (i == j)
				{
					printf("%d ", i);
					k++;
                    if (k % 10 == 0)
			          printf("\n");
                }
			
		}
		
	}
	return 0;
}

 7-40 输出整数各位数字

本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。

输入格式:

输入在一行中给出一个长整型范围内的非负整数。

输出格式:

从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。

输入样例:

123456

输出样例:

1 2 3 4 5 6 
#include <stdio.h>
int main()
{
	int n, x = 1, t=0, a;
	scanf("%d", &n);
	t = n;
	while (t > 9)
	{
		t /= 10;
		x *= 10;
	}
	while (x > 0)
	{
		printf("%d ", n/x);
        n%=x;
		x /= 10;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘心不灭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值