目录
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*1
到N*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");
}
}
今天的文章【PTA】【C语言】复盘练习——编程题分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/62667.html