【PTA-C语言】实验四-循环结构II

7-1 跟奥巴马一起画方块(分数 15)

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!

输入格式:
输入在一行中给出正方形边长N(3≤N≤21)和组成正方形边的某种字符C,间隔一个空格。

输出格式:
输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。

输入样例:

10 a

输出样例:

aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa

代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

参考代码

#include<stdio.h>
int fun(int n)
{
    double t = n*1.0/2;
    if(t+0.5>=(int)t+1.0)
        return (int)t+1;
    else
        return (int)t;
}
int main()
{
    int n, i, j;
    char c;
    scanf("%d %c", &n, &c);
    int t = fun(n);
    for(i=0; i<t; i++) {
        for(j=0; j<n; j++)
            printf("%c", c);
        printf("\n");
    }
    return 0;
}

7-2 打印九九口诀表(分数 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  

代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

参考代码

#include<stdio.h>
int main()
{
    int i, j, n;
    scanf("%d", &n);
    for(i=0; i<=n; i++)
        for(j=1; j<=i; j++) {
            printf("%d*%d=%-4d", j, i, i*j);
            if(i==j)
                printf("\n");
        }
    return 0;
}

7-3 求符合给定条件的整数集(分数 15)

给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。

输入格式:
输入在一行中给出A。

输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。

输入样例:

2

输出样例:

234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543

代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码

#include<stdio.h>
int main(){
    int n, i, j, k;
    int flag=0;
    scanf("%d",&n);
    for(i=n; i<=n+3; i++)
        for(j=n; j<=n+3; j++)
            for(k=n; j!=i && k<=n+3; k++)
                if(k!=i && k!=j) {
                    if(flag==0) {
                        printf("%d", i*100+j*10+k);
                        flag++;
                    } else if(flag==5) {
                        printf(" %d\n", i*100+j*10+k);
                        flag=0;
                    } else {
                        printf(" %d", i*100+j*10+k);
                        flag++;
                    }
                }
    return 0;
}

7-4 求特殊方程的正整数解(分数 15)

本题要求对任意给定的正整数N,求方程X2 + Y2 = N 的全部正整数解。

输入格式:
输入在一行中给出正整数N(≤10000)。

输出格式:
输出方程X2 + Y2 = N的全部正整数解,其中 X ≤ Y 。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution

输入样例1:

884

输出样例1:

10 28
20 22

输入样例2:

11

输出样例2:

No Solution

代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

参考代码

#include<stdio.h>
int main()
{
    int x, y, n, flag = 0;
    scanf("%d", &n);
    for (x = 1; x <= 100; ++ x)
        for (y = x; y <= 100; ++ y)
            if (x*x + y*y == n) {
                printf("%d %d\n", x, y);
                flag = 1;
            }
    if (!flag)
        printf("No Solution\n");
    return 0;
}

7-5 不变初心数(分数 15)

不变初心数是指这样一种特别的数,它分别乘 2、3、4、5、6、7、8、9 时,所得乘积各位数之和却不变。例如 18 就是这样的数:18 的 2 倍是 36,3+6=9;18 的 3 倍是 54,5+4=9;…… 18 的 9 倍是 162,1+6+2=9。对于 18 而言,9 就是它的初心。本题要求你判断任一个给定的数是否有不变的初心。

输入格式:
输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一个不超过 105
的正整数。

输出格式:
对每个给定的数字,如果它有不变的初心,就在一行中输出它的初心;否则输出 NO

输入样例:

4
18
256
99792
88672

输出样例:

9
NO
36
NO

代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

参考代码

#include <stdio.h>
int main(){
    int n, sum=0, i, t, j, a, f, c=0;
    scanf("%d", &n);
    for(i=0; i<n; i++) {
        scanf("%d", &a);
        t = a; sum = 0;
        while(t){
            sum += t%10;
            t /= 10;
        }
        f = sum; c = 0;
        for(j=2; j<=9; j++) {
            t = a*j;
            sum = 0;
            while(t){
              sum += t%10;
              t /= 10;
            }
            if(sum==f)
                c++;
        }
        if(c==8)
            printf("%d\n", f);
        else
            printf("NO\n");
    }
    return 0;
}

7-6 Wifi密码(分数 15)

下面是微博上流传的一张照片:“各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1;B-2;C-3;D-4;请同学们自己作答,每两日一换。谢谢合作!!~”—— 老师们为了促进学生学习也是拼了…… 本题就要求你写程序把一系列题目的答案按照卷子上给出的对应关系翻译成 wifi 的密码。这里简单假设每道选择题都有 4 个选项,有且只有 1 个正确答案。

在这里插入图片描述

输入格式:
输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行按照 编号-答案 的格式给出一道题的 4 个选项,T 表示正确选项,F 表示错误选项。选项间用空格分隔。

输出格式:
在一行中输出 wifi 密码。

输入样例:

8
A-T B-F C-F D-F
C-T B-F A-F D-F
A-F D-F C-F B-T
B-T A-F C-F D-F
B-F D-T A-F C-F
A-T C-F B-F D-F
D-T B-F C-F A-F
C-T A-F B-F D-F

输出样例:

13224143

代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

参考代码

#include<stdio.h>
int main()
{
    int i, j, n;
    char a[n][15], b[n];
    scanf("%d", &n);
    getchar();
    for(i=0; i<n; i++)
        gets(a[i]);
    for(i=0; i<n; i++)
        for(j=2; j<15; j+=4)
            if(a[i][j] == 'T')
                b[i] = a[i][j-2];
    for(i=0; i<n; i++)
        if(b[i] == 'A')
            printf("1");
        else if(b[i] == 'B')
            printf("2");
        else if(b[i] == 'C')
            printf("3");
        else
            printf("4");
    return 0;
}

7-7 梅森数(分数 15)

形如2n − 1的素数称为梅森数(Mersenne Number)。例如22 −1=3、23−1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了231−1=2147483647是一个素数,堪称当时世界上“已知最大素数”的一个记录。

本题要求编写程序,对任一正整数n(n<20),输出所有不超过2n − 1的梅森数。

输入格式:
输入在一行中给出正整数n(n<20)。

输出格式:
按从小到大的顺序输出所有不超过2n − 1的梅森数,每行一个。如果完全没有,则输出“None”。

输入样例:

6

输出样例:

3
7
31

代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

参考代码

#include<stdio.h>
#include<math.h>
int main()
{
    int i, j, n, m=0, k=0, c=0;
    scanf("%d", &n);
    for(i=2; i<=n; i++, c=0) {
        m = pow(2, i)-1;
        for(j=2; j<=sqrt(m); j++)
            if(m%j==0) {
                c++;
                break;
            }
        if(c==0) {
            printf("%d\n", m);
            k++;
        }
    }
    if(!k) printf("None");
    return 0;
} 
  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

谛凌

本人水平有限,感谢您支持与指正

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

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

打赏作者

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

抵扣说明:

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

余额充值