pta模拟题(7-15 BCD解密、7-16 数列求和-加强版、7-17 出租、7-18 反向数相加、7-19 一帮一、7-20 连续因子)

7-15 BCD解密

BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!

现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。

输入格式:

输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。

输出格式:

输出对应的十进制数。

输入样例:

18

输出样例:

12

代码如下

#include<stdio.h>
int main()
{
    int num;
    scanf("%d",&num);
    printf("%x",num);
    return 0;
}

实际上就是输入一个数,将这个数转化为16进制;

#include<stdio.h>
int main()
{
    int n =0;
    scanf("%d",&n);
    int a,b;
    a=n/16;
    b=n%16;
    printf("%d",10*a+1*b);
    return 0;
}

7-16 数列求和-加强版

给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。

输入格式:

输入数字A与非负整数N。

输出格式:

输出其N项数列之和S的值。

输入样例:

1 3

输出样例:

123

 

代码如下

#include <stdio.h>
int main() 
{
    int A, N;
    scanf("%d %d", &A, &N);
    int s[100001] = {0};
    int jinwei = 0, num = N, weishu = 0;
    for (int i = 0; i < N + 1; i++) 
    {
        s[i] = num * A + jinwei;
        jinwei = s[i] / 10;
        s[i] = s[i] % 10;
        num--;
    }
    for (int i = N; i >= 0; i--) 
    {
        if (s[i] != 0) 
        {
            weishu = i;
            break;
        }
    }
    for (int i = weishu; i >= 0; i--) 
    {
        printf("%d", s[i]);
    }
    return 0;
}

7-17 出租

下面是新浪微博上曾经很火的一张图:

一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1index[1]=0 对应 arr[0]=8index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100

本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。

输入格式:

输入在一行中给出一个由11位数字组成的手机号码。

输出格式:

为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。

输入样例:

18013820100

输出样例:

int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};

代码如下

#include<stdio.h>
int main()
{
    char num[12];
    int arr[10]={0};
    scanf("%s",num);
    int count = 0;
    for(int i =0;i<11;++i)
    {
        if(arr[num[i]-'0']==0)
        {
            arr[num[i]-'0']=1;
            count++;
        }
    }
    int nums[count];
    printf("int[] arr = new int[]{");
    int j =-1;
    for(int i =9;i>=0;--i)
    {
        if(arr[i]==1)
        {
            nums[++j]=i;
            printf("%d",i);
            if(j<count-1)
                printf(",");
        }
    }
    printf("};\nint[] index = new int[]{");
    for(int j = 0;j<11;++j)
    {
        for(int i = 0;i<count;++i)
        {
            if((num[j]-'0')==nums[i])
            {
                printf("%d",i);
                if(j<10)
                    printf(",");
            }
        }
    }
    printf("};\n");
    return 0;
}

7-18 反向数相加

反向数是将一个阿拉伯数字按相反的次序写。把第一个数字写成最后一个数字,依次类推。 例如, 1245的反向数为5421。请注意,数字所有的前导零要被省略,所以,如果数字结尾有零,写反向数时零被略去(例如,1200的反向数是21)。还要注意反向数没有零结尾。
你的任务是将两个反向数相加,并输出它们的反向和。当然,结果不是唯一的,因为一个数可以是几个数的反向形式(例如21在反向前可以是12,120 或1200)。为此,本题设定没有0因为反向而丢失(例如,设定原来的数是12)。

输入格式:

输入由N个测试用例组成。输入的第一行仅给出正整数N,然后给出测试用例。每个测试用例一行,由2个由空格分开的正整数组成,这是要反向相加的数。

输出格式:

对每个测试用例,输出一行,仅包含一个整数,将两个反向数进行求和,之后再反向。在输出时把前导0略去。

输入样例:

3
24 1
4358 754
305 794

输出样例:

34
1998
1

代码如下

#include <stdio.h>
int backshu(int num)
{
    int ret = 0;
    while(num>0)
    {
        ret = ret * 10 + num % 10;
        num /= 10;
    }
    return ret;
}

int main() 
{
    int N;
    scanf("%d", &N);
    for (int i = 0; i < N; i++) 
    {
        int num1,num2;
        scanf("%d %d", &num1, &num2);
        int ret1 = backshu(num1);
        int ret2 = backshu(num2);
        int sum = ret1 + ret2;
        int backsum = backshu(sum);
        printf("%d\n", backsum);
    }
    return 0;
}

7-19 一帮一

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

输入格式:

输入第一行给出正偶数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> 
struct Student
{
    int sex;
    char name[9];
}stu[50] = {0};
int main()
{  
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;++i)  
    {  
        scanf("%d %s",&stu[i].sex,stu[i].name); 
    } 
    for(int i=0;i<n;++i)  
    {  
        for(int 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;
}

7-20 连续因子

分数 300

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数 N(1<N<231)。

输出格式:

首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630

输出样例:

3
5*6*7

代码如下 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不懂c语言的小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值