【PTA】【C语言】复盘练习——编程题

目录

R7-1 完全数

输入格式:

输出格式:

输入样例:

输出样例:

输入样例:

输出样例:

R7-2 判断完全数

输入样例:

输出样例:

输入样例:

输出样例:

 R7-3 函数返回一个整数是否为完全数

输入样例:

输出样例:

输入样例:

输出样例:

R7-4 h0034. 平方矩阵 II

输入格式:

输出格式:

输入样例:

输出样例:

 R7-5 选夫婿^_^

输入格式:

输出格式:

输入样例:

输出样例:

 R7-6 一帮一

输入格式:

输出格式:

输入样例:

输出样例:

 R7-7 猜数字*

输入样例

输出样例

 R7-8 h0105. 弟弟的作业

输入格式:

输出格式:

输入样例:

输出样例:

 R7-9 一维数组最大值和最小值交换

输入格式:

输出格式:

输入样例:

输出样例:

 R7-10 打印九九口诀表

输入格式:

输出格式:

输入样例:

输出样例:

 R7-11 乒乓球赛轮次

输入格式:

输出格式:

输入样例:

输出样例:

 R7-12 有理数加法

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

 R7-13 万万没想到之还是没想到

输入格式:

输出格式:

输入样例:

输出样例:

 R7-14 到底是不是太胖了

输入格式:

输出格式:

输入样例:

输出样例:


R7-1 完全数

完全数,指所有的真因子(即除了自身以外的约数)的和,恰好等于它本身。本题目要求读入2个整数A和B,输出该范围内的所有完全数(A<=完全数<=B)。

输入格式:

输入在一行中给出2个整数A和B。

输出格式:

以“完全数=约数1+约数2+...”的格式,输出该范围(A<=完全数<=B)内的所有完全数,每个完全数占一行。若该范围内没有完全数,则打印“no”。

输入样例:

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

1 100

输出样例:

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

6=1+2+3
28=1+2+4+7+14

输入样例:

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

10 20

输出样例:

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

no

 代码如下:

#include <stdio.h>
#include <string.h>
int func(int a)
{
    int i, b[99] = {0}, j = 0, sum = 0;
    for (i = 1; i < a; i++)
    {
        if (a % i == 0)
        {
            sum += i;
            b[j++] = i;
        }
    }
    if (sum == a)
    {
        printf("%d=", a);
        for (i = 0; b[i] != 0; i++)
        {
            printf("%d", b[i]);
            if (b[i + 1] != 0)
                printf("+");
        }
        printf("\n");
        return 1;
    }
    return 0;
}

int main()
{
    int m, n, i, count = 0;
    scanf("%d %d", &m, &n);
    for (i = m; i <= n; i++)
    {
        if (func(i) == 1)
            count += 1;
    }
    if (count == 0)
        printf("no");
    return 0;
}

R7-2 判断完全数

编程输入一个不小于6的正整数N(N<99999999),输出它是不是完全数。真约数之和恰好等于它本身的数是完全数。

输入样例:

28

输出样例:

YES

输入样例:

100

输出样例:

NO

代码如下:

#include <stdio.h>
#include <string.h>
int func(int a)
{
    int i, sum = 0;
    for (i = 1; i < a; i++)
    {
        if (a % i == 0)
        {
            sum += i;
        }
    }
    if (sum == a)
        return 1;
    return 0;
}

int main()
{
    int n;
    scanf("%d", &n);
    if (func(n))
        printf("YES");
    else
        printf("NO");
    return 0;
}

 R7-3 函数返回一个整数是否为完全数

编写函数返回形式参数(一个正整数)是否为完全数。主函数功能为:输入一个整数N(N<5000),输出不小于N的第一个完全数。

输入样例:

20

输出样例:

28

输入样例:

100

输出样例:

496

代码如下: 

#include<stdio.h>
int is_perfect(int n)
{
	int i,sum = 0;
	for(i = 1; i < n; i++)
	{
		if(n % i == 0)
			sum += i;
	}
    if(sum == n)
		return 1;
	return 0;
}
int main()
{
	int n, i;
	scanf("%d",&n);
    for(i = n;; i++)
	{
		if(is_perfect(i))
		{
			printf("%d",i);
			break;
		}
	}
	return 0;
}

R7-4 h0034. 平方矩阵 II

输入整数N,输出一个N阶的二维数组。

数组的形式参照样例。

输入格式:

输入包含多行,每行包含一个整数N。0≤N≤100

当输入行为N=0时,表示输入结束,且该行无需作任何处理。

输出格式:

对于每个输入整数N,输出一个满足要求的N阶二维数组。

每个数组占N行,每行包含N个用空格隔开的整数。

每个数组输出完毕后,输出一个空行。

输入样例:

1
2
3
4
5
0

输出样例:

1 

1 2 
2 1 

1 2 3 
2 1 2 
3 2 1 

1 2 3 4 
2 1 2 3 
3 2 1 2 
4 3 2 1 

1 2 3 4 5 
2 1 2 3 4 
3 2 1 2 3 
4 3 2 1 2 
5 4 3 2 1 

代码如下:(十分感谢qzjhjxj的博客_CSDN博客-领域博主提供思路与解答)

#include <stdio.h>
#include <stdlib.h>
int arr[101][101];
void Init()
{
    int i, j;
    for (i = 0; i <= 100; i++)
        for (j = 0; j <= 100; j++)
            arr[i][j] = abs(i - j) + 1;
}
int main()
{
    int i, j, n;
    Init();
    while (scanf("%d", &n) == 1 && n != 0)
    {
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
                printf("%d ", arr[i][j]);
            printf("\n");
        }
        printf("\n");
    }
}

 R7-5 选夫婿^_^

倾国倾城的大家闺秀潘小姐要选夫婿啦!武林中各门各派,武林外各大户人家,闻讯纷纷前来,强势围观。前来参与竞选的男生藏龙卧虎,高手云集,才子遍布,帅哥纷纭,更不乏富二代,官二代,可谓声势空前。

每个人参与竞选的帅哥除了进行一段激情洋溢的求婚演讲以外,还要报上自己姓名、身高和体重,以及个人简历。最后再进行文武选拔,最后夺魁者方能得到潘小姐的芳心。

潘小姐不爱名利,只看人,第一关就是身高和体重要合格,即必须在其要求的范围内,否则直接排除在外,不允许参加下一轮的选拔。

作为一个程序员,你没有钱也没有权,擅长的也就是编程了。潘小姐也发现了这一点,所以把首轮根据身高体重进行选拔的任务交给了你,如果完成的好,你可以直接进入下一轮选拔,你笑了。

输入格式:

潘小姐给你了所有报名男生的信息。输入数据的第一行是一个正整数N(0 < N < 1000)。然后N行数据,每行包含三部分,用空格隔开。第一部分是报名者的姓名name(长度小于20的字符串),然后是整数身高h(0 < h < 300),第三部分是整数体重w (0 < w < 200)。

最后一行是四个整数a,b,c,d.表示身高的合格范围是[a,b],体重的合格范围是[c,d](0 < a < b < 200, 0 < c < d < 300)。

输出格式:

你需要把合格的男生信息按照身高从低到高输出,格式跟输入一样,也是每行三个信息,共N行,如果身高相同则按体重从轻到重输出,如果身高相同并且体重相同则按照输入顺序依次输出,若没有合格人选则输出NO,具体格式见样例。

输入样例:

8
武大郎 70 40
西门庆 180 70
李逵 160 150
燕青 175 69
鲁智深 180 100
武松 180 75
小泉纯一狼 30 20
孙二娘 169 60
165 190 60 90

输出样例:

孙二娘 169 60
燕青 175 69
西门庆 180 70
武松 180 75

代码如下:

#include <stdio.h>
#include <string.h>
struct man
{
    char name[25];
    int h;
    int w;
}m[999], t;

int main()
{
    int n, i, j, a, b, c, d, flag = 0;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%s %d %d", m[i].name, &m[i].h, &m[i].w);
    }
    scanf("%d %d %d %d", &a, &b, &c, &d);
    for (i = 0; i < n - 1; i++)
        for (j = 0; j < n - i - 1; j++)
        {
            if (m[j].h > m[j + 1].h)
            {
                t = m[j];
                m[j] = m[j + 1];
                m[j + 1] = t;
            }
            else if (m[j].h == m[j + 1].h)
            {
                if (m[j].w > m[j + 1].w)
                {
                    t = m[j];
                    m[j] = m[j + 1];
                    m[j + 1] = t;
                }
            }
        }
    for (i = 0; i < n; i++)
    {
        if(m[i].h >= a && m[i].h <= b && m[i].w >= c && m[i].w <= d)
        {
            printf("%s %d %d\n", m[i].name, m[i].h, m[i].w);
            flag = 1;
        }
    }
    if (flag == 0)
        printf("NO\n");
    return 0;
}

 R7-6 一帮一

“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

输入格式:

输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。

输出格式:

每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。

输入样例:

8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda

输出样例:

Amy Jack
Tom Linda
Bill Maya
Cindy John

代码如下:

#include <stdio.h>
#include <string.h>

struct student
{
    int sex;
    char name[9];
}stu[50];

int main()
{
    int n, i, j;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%d %s", &stu[i].sex, &stu[i].name);
    for (i = 0; i < n; i++)
        for (j = n - 1; j >= i; j--)
        {
            if (stu[i].sex != stu[j].sex && stu[j].sex != -1)
            {
                printf("%s %s\n", stu[i].name, stu[j].name);
                stu[j].sex = -1;
                break;
            }
        }
    return 0;
}

 R7-7 猜数字*

在下面的算式中,被乘数的 4 位数字 a、b、c、d 各不相同。

显然 a、d都不为0。

请编写程序,输入 x,若存在满足条件的算式,则按被乘数由小到大的顺序输出全部答案,否则输出“None”。

要求:程序不断输入不同的乘数 x,然后输出对应的结果,直到输入 0 为止。

输入样例

5
4
1
0

输出样例

None
2178 * 4 = 8712
None

代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
    int n, a, b, c, d, i, sum;
    while (1)
    {
        scanf("%d", &n);
        if (n == 0)
            break;
        int flag = 0;
        for (i = 1000; i < 10000; i++)
        {
            d = i % 10;    c = i / 10 % 10;    b = i / 100 % 10;    a = i / 1000 % 10;
            sum = d*1000+c*100+b*10+a;
            if (i * n == sum)
            {
                if (a != b && a != c && a != d && b != c && b != d && c != d)
                {
                    printf("%d * %d = %d\n", i, n, sum);
                    flag = 1;
                }
            }
        }
        if (flag == 0)
            printf("None\n");
    }
}

 R7-8 h0105. 弟弟的作业

你的弟弟刚做完了“100以内数的加减法”这部分的作业,请你帮他检查一下。每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a和b是作业中给出的,均为不超过100的非负整数;c是弟弟算出的答案,可能是不超过200的非负整数,也可能是单个字符"?",表示他不会算。

输入格式:

输入文件包含不超过100行,以文件结束符结尾。每行包含一道题目,格式保证符合上述规定,且不包含任何空白字符。输入的所有整数均不含前导0。

输出格式:

输出仅一行,包含一个非负整数,即弟弟答对的题目数量。

输入样例:

1+2=3
3-1=5
6+7=?
99-0=99

输出样例:

2

代码如下:

#include<stdio.h>
#include<string.h>
int main()
{
	int a, b, d, sum = 0, len;
    char s, c[4];
    while(scanf("%d%c%d=%s", &a, &s, &b, c) != EOF)
	{
	    len = strlen(c);
		if(c[0] != '?')
        { 
		    if(len == 1)
			    d = c[0]-'0';
            if(len == 2)
                d = (c[0]-'0')*10 + c[1]-'0';
            if(len == 3)
                d = (c[0]-'0')*100 + (c[1]-'0')*10 + c[2]-'0';
            if(s == '+')
            {
                if(a+b == d)
                sum++;
            }
            if(s == '-')
            {
                if(a-b == d)
                sum++;
            }
        }
    }
    printf("%d\n",sum);
    return 0; 
}

 R7-9 一维数组最大值和最小值交换

找出含有10个元素一维数组中的最大值和最小值,并互换这两个数的位置。

输入格式:

在一行中输入10个整数,数据之间只能用1个空格间隔。

输出格式:

在一行中按照“max=最大值,min=最小值”的格式输出结果,最大值和最小值均原样输出,没有列宽控制。
在下一行中输出交换完最大值和最小值的一维数组,每个数据输出占5列。

输入样例:

6 5 1 2 3 4 8 9 7 5

输出样例:

max=9,min=1
    6    5    9    2    3    4    8    1    7    5

代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
    int i, t, m, n, a[99], max = -99, min = 99;
    for (i = 0; i < 10; i++)
    {
        scanf("%d", &a[i]);
    }
    for (i = 0; i < 10; i++)
    {
        if (max < a[i])
        {
            max = a[i];
            m = i;
        }
        if (min > a[i])
        {
            min = a[i];
            n = i;
        }
    }
    t = a[m]; a[m] = a[n]; a[n] = t;
    printf("max=%d,min=%d\n", max, min);
    for (i = 0; i < 10; i++)
        printf("%5d", a[i]);
    return 0;
}

 R7-10 打印九九口诀表

下面是一个完整的下三角九九口诀表:

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*1N*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>
#include <string.h>
int main()
{
    int n, i, j;
    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;
}

 R7-11 乒乓球赛轮次

校工会正计划举行一场全校教职员工的乒乓球赛。在每一轮比赛中,参赛者都是两两比赛,输者淘汰,赢者将进入下一轮。比赛一直进行到只剩下一个人为止,这个人就是冠军。在每一轮比赛中,如果比赛人数不是偶数,那么将随机选择一个参赛者自动晋级到下一轮比赛中,而其他人则还是捉对厮杀。主办方想知道产生冠军总共需要安排多少轮比赛?

输入格式:

输入数据首先包含一个整数T,表示测试实例的个数,然后是T行测试数据。每行包括1个正整数n(1<=n<=10^9),代表参赛的总人数。这里,10^9表示10的9次方。

输出格式:

对于每个测试,在一行上输出比赛所需要的总轮数。

输入样例:

4
8
777
15
100

输出样例:

3
10
4
7

代码如下:

#include <stdio.h>
#include <string.h>
int func(int n)
{
    int count = 0, a = 2;
    while (n != 1)
    {
        if (n % 2 == 0)
        {
            n /= 2;
            count++;
        }
        else
        {
            n = (n - 1) / 2;
            n += 1;
            count++;
        }
    }
    return count;
}

int main()
{
    int n, m;
    scanf("%d", &n);
    while (n--)
    {
        scanf("%d", &m);
        printf("%d\n", func(m));
    }
    return 0;
}

 R7-12 有理数加法

本题要求编写程序,计算两个有理数的和。

输入格式:

输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

输出格式:

在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1:

1/3 1/6

输出样例1:

1/2

输入样例2:

4/3 2/3

输出样例2:

2

代码如下:

#include <stdio.h>
#include <string.h>
int gcd(int m, int n)
{
    int t;
    while (n)
    {
        t = m % n;
        m = n;  n = t;
    }
    return m;
}

int main()
{
    int x1, y1, x2, y2, i, a, b;
	scanf("%d/%d", &x1, &y1);
	scanf("%d/%d", &x2, &y2);
    a = x1 * y2 + x2 * y1;
    b = y1 * y2;
    if (a % b == 0)
        printf("%d", a / b);
    else
    {
        i = gcd(a, b);
        a /= i;
        b /= i;
        printf("%d/%d", a, b);
    }
    return 0;
}

 R7-13 万万没想到之还是没想到

大家好,我不是王大锤,万万没想到转眼已经在公司工作了50年,在临终前我再次见到了上帝,上帝又带来了问题,让我计算1到n的平方和,如n=3,则平方和为1^2+2^2+3^2=14。如果我能解决这个问题,用不了多久,我就能升值加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰,呵呵,想想还有点小激动(丫的,还有完没完)。聪明的ACMer,你能不能帮我计算出这是个数的和呢?

输入格式:

第一行输入一个n,n小于45

输出格式:

输出平方和,每个和占一行。

输入样例:

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

3

输出样例:

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

14

代码如下:(注意while(scanf("%d",&n) != EOF)要的是“一组”数据

#include <stdio.h>
#include <string.h>
#include <math.h>
int func(int n)
{
    int sum = 0;
    while(n)
    {
        sum += pow(n, 2);
        n--;
    }
    return sum;
}

int main()
{
    int n;
    while(scanf("%d",&n) != EOF)
    {
        printf("%d\n", func(n));
    }
    return 0;
}

 R7-14 到底是不是太胖了

据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。

输入格式:

输入第一行给出一个正整数N(≤ 20)。随后N行,每行给出两个整数,分别是一个人的身高H(120 < H < 200;单位:厘米)和真实体重W(50 < W ≤ 300;单位:市斤),其间以空格分隔。

输出格式:

为每个人输出一行结论:如果是完美身材,输出You are wan mei!;如果太胖了,输出You are tai pang le!;否则输出You are tai shou le!

输入样例:

3
169 136
150 81
178 155

输出样例:

You are wan mei!
You are tai shou le!
You are tai pang le!

代码如下: 

#include<stdio.h>
#include<math.h>
int main()
{
	int N, i, H, W, z;
    scanf("%d",&N);
	for(i = 1; i <= N; i++)
    {
        scanf("%d%d",&H,&W);
        z = (H-100)*1.8;
	    if(fabs(z-W) < (z*0.1))
	        printf("You are wan mei!\n");
	    else if(z > W)
	        printf("You are tai shou le!\n");
	    else	
	        printf("You are tai pang le!\n");
	}
 } 

  • 10
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鸢想睡觉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值