基础实验2-2.1:整数的分类处理

给定N个正整数,要求从中得到下列三种计算结果:
1.A1=能被三整除的最大整数
2.A2=存在整数K使之可以表示为3K+1的整数个数
3.A3=存在整数K使之可以表示为3K+2的所有整数的平均值(精确到小数点后一位)

输入格式

第一行输入N,随后一行输入N个正整数,所有数字不超过100

输出格式

一行按顺序输出A1,A2,A3的值,如果某个数字不存在则输出NONE

输入样例 复制
8
5 8 7 6 9 1 3 10
输出样例 复制
9 3 6.5
#include<stdio.h>
#include<math.h>
int main()
{
    int a[1000],n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i-1]);
    }
    int a1=0,a2=0,a3=0;
    float a3_sum;
    float a3_aver;
    for(int i=1;i<=n;i++)
    {
        if(a[i-1]%3==0)
        {
            if(a[i-1]>=a1)
            {
                a1=a[i-1];
            }
        }
        if(a[i-1]%3==1)
        {
            a2++;
        }
        if(a[i-1]%3==2)
        {
            a3++;
            a3_sum+=a[i-1];
        }
    }
    a3_aver=a3_sum/a3;
    if(a1==0&&a2==0&&a3==0)
    printf("NONE NONE NONE ");
    if(a1==0&&a2==0&&a3!=0)
    printf("NONE NONE %.1f ",a3_aver);
    if(a1==0&&a2!=0&&a3==0)
    printf("NONE %d NONE ",a2);
    if(a1==0&&a2!=0&&a3!=0)
    printf("NONE %d %.1f ",a2,a3_aver);
    if(a1!=0&&a2==0&&a3==0)
    printf("%d NONE NONE ",a1);
    if(a1!=0&&a2==0&&a3!=0)
    printf("%d NONE %.1f ",a1,a3_aver);
    if(a1!=0&&a2!=0&&a3==0)
    printf("%d %d NONE ",a1,a2);
    if(a1!=0&&a2!=0&&a3!=0)
    printf("%d %d %.1f ",a1,a2,a3_aver);
    
    
}

 

 

 

 

### 回答1: 好的,根据你的要求,我将用中文回答你的问题。 假设给定一个正整数 n,我们要求出满足以下三种条件的整数集合: a1 = 能被 3 整除最大整数 a2 = 形如 3k+1 的整数个数,其中 k 是任意整数 a3 = 形如 3k 的整数个数,其中 k 是任意整数 下面分别来讨论如何求解这三个问题: 1. 求 a1: 由于 a1 是能被 3 整除最大整数,因此我们只需要将 n 对 3 取余,然后将结果减去 3 即可。具体而言,假设 n 对 3 的余数为 r,则: a1 = n - r 例如,如果 n 是 17,则 n 对 3 的余数是 2,因此 a1 = 17 - 2 = 15。 2. 求 a2: 对于任意一个形如 3k+1 的整数,我们可以将其写成 3k+(1-3),也就是说,它可以被表示为一个能被 3 整除整数加上一个固定的偏移量。因此,如果我们知道了 n 中能被 3 整除整数个数,那么就可以求出 n 中形如 3k+1 的整数的个数。具体而言,设 n 中能被 3 整除整数个数为 x,则: a2 = (n - x) / 3 为了求出 x,我们只需要将 n 对 3 取余,然后将结果除以 3 即可。具体而言,假设 n 对 3 的余数为 r,则: x = r / 3 例如,如果 n 是 17,则 n 对 3 的余数是 2,因此 x = 2/3 = 0(整数除以整数结果也是整数)。因此,a2 = (17-0)/3 = 5。 3. 求 a3: 与求解 a2 的方法类似,我们可以将形如 3k 的整数写成 3k+(-3),也就是说,它可以被表示为一个能被 3 整除整数减去一个固定的偏移量。因此,如果我们知道了 n 中能被 3 整除整数个数,那么就可以求出 n 中形如 3k 的整数的个数。具体而言,设 n 中能被 3 整除整数个数为 y,则: a3 = y 为了求出 y,我们只需要将 n 对 3 取余即可。具体而言,假设 n 对 3 的余数为 r,则: y = r 例如,如果 n 是 17,则 n 对 3 的余数是 2,因此 y = 2。因此,a3 = 2。 ### 回答2: 题目中给出了n个正整数,我们需要从中得到三种计算结果,分别是能被3整除最大整数a1、可以表示为3k+1的整数的个数a2以及可以表示为3k的整数个数a3。 首先考虑a1,我们需要找到这n个正整数中能被3整除最大的数。可以考虑对这n个数从大到小排序,然后依次判断能否被3整除,找到第一个能被3整除的数即为a1。 接下来考虑a2,我们需要找到这n个数中有多少个可以表示为3k+1的数。可以考虑对每个数进行模3操作,如果余数为1则说明可以表示为3k+1的形式,统计出余数为1的个数即为a2。 最后考虑a3,我们需要找到这n个数中有多少个可以表示为3k的数。同样可以对每个数进行模3操作,如果余数为0则说明可以表示为3k的形式,统计出余数为0的个数即为a3。 综上所述,我们可以先对这n个数进行排序,然后进行逐个判断获得a1、a2和a3的值。代码如下所示: ``` #include <iostream> #include <algorithm> using namespace std; int main() { int n, a[100000]; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; sort(a, a + n); // 排序 int a1 = 0, a2 = 0, a3 = 0; for (int i = n - 1; i >= 0; i--) { if (a[i] % 3 == 0 && a[i] > a1) // 找到最大的能被3整除的数 a1 = a[i]; if (a[i] % 3 == 1) // 统计可以表示为3k+1的数 a2++; if (a[i] % 3 == 0) // 统计可以表示为3k的数 a3++; } cout << a1 << " " << a2 << " " << a3 << endl; return 0; } ``` ### 回答3: 这是一道计算题,给定 n 个正整数,需要从中得到三种计算结果:能被 3 整除最大整数、能表示为 3k + 1 的整数的个数、能表示为 3k 的整数的个数。 首先,我们需要遍历这 n 个正整数,找出最大的能被 3 整除的数。遍历时需要判断每个数是否能被 3 整除,并且保留遍历过程中得到最大值。 其次,我们需要统计能表示为 3k + 1 的整数个数。统计过程可以使用取模运算来判断一个数能否表示为 3k + 1 的形式。即,将每个数 mod 3,得到的余数为 0、1、2 中的一个,如果余数为 1,则说明这个数可以表示为 3k + 1 的形式,我们可以使用一个计数器来累计这样的数的个数。 最后,我们需要统计能表示为 3k 的整数的个数。同样可以使用取模运算来判断。如果余数为 0,则说明这个数可以表示为 3k 的形式,我们可以使用一个计数器来累计这样的数的个数。 综上所述,我们可以编写一个程序,通过遍历 n 个正整数,得出能被 3 整除最大整数、能表示为 3k + 1 的整数的个数、能表示为 3k 的整数的个数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值