• 【C/PTA】数组练习(编程)


    本文结合PTA专项练习带领读者掌握数组,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。

    7-1 计算最大值出现的次数

    计算一维数组中最大值出现的次数。
    输入格式:

    输入在一行n( n<=1000,代表数组的大小),在下一行中输入 n个整数,为一维数组的元素。
    输出格式:

    输出最大值和出现的次数。
    输入样例:

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

    4
    4 2 2 4

    输出样例:

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

    4 2

    #include 
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	int a[n];
    	for(int i=0;i<n;i++)
    	{
    		scanf("%d",&a[i]);
    	}
    	
    	int max=a[0];
    	int count=0;
    	
    	for(int i=0;i<n;i++)
    	{
    		if(a[i]>max)
    		max=a[i];
    	}
    	
    	for(int i=0;i<n;i++)
    	{
    		if(max==a[i])
    		count++;
    	}
    	
    	printf("%d %d",max,count);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    7-2 求一批整数中出现最多的个位数字

    给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。
    输入格式:

    输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。
    输出格式:

    在一行中按格式“M: n1 n2 …”输出,其中M是最大次数,n1、n2、……为出现次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。
    输入样例:

    3
    1234 2345 3456

    输出样例:

    3: 3 4

    #include
    int main()
    {
        int i, n;
        int a[1000];//储存输入的整数
        int b[10]={0};//记录每个个位数字出现的次数,一开始均为0
        int t=-1;//暂时存储每个整数的个位数字
        int max=-1;//记录出现次数最多的个位数字的次数
        scanf("%d", &n);
        
    	for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        
    	for(i=0;i<n;i++)//遍历每个整数
        {
             do//用do while将每一位都取出
            {
                t=a[i]%10;
                b[t]++; //如果是3,则b[3]的值加一
                a[i]=a[i]/10;
            }while(a[i]!=0);
        }
        //上一个循环结束后 b数组中储存的是每个数字对应的个数
        //现在找出出现次数最多的整数
        for(i=0;i<10;i++)
        {
            if(b[i]>max)
            {
                max=b[i];
            }
        }
        printf("%d:",max);
        for(i=0;i<10;i++)
        {
            if(max==b[i])//打印次数
            {
                printf(" %d",i);
            }
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    7-3 装箱问题

    假设有N项物品,大小分别为s1​、s2​、…、si​、…、sN​,其中si​为满足1≤si​≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。
    输入格式:

    输入第一行给出物品个数N(≤1000);第二行给出N个正整数si​(1≤si​≤100,表示第i项物品的大小)。
    输出格式:

    按照输入顺序输出每个物品的大小及其所在的箱子序号,每个物品占1行,最后一行输出所需的箱子数目。
    输入样例:

    8
    60 70 80 90 30 40 10 20

    输出样例:

    60 1
    70 2
    80 3
    90 4
    30 1
    40 5
    10 1
    20 2
    5

    #include
    int main()
    {
        int n;
        scanf("%d",&n);
        int a[1000]={0};
        int k=1;//表示目前已使用的箱子数目
        
        for(int i=0;i<n;i++)
        {
            int t;
            scanf("%d",&t);//依次读入每个物品的大小
            for(int j=0;j<k;j++)
            {
                if(a[j]+t<=100)
                {
                    a[j] += t;
                    printf("%d %d\n",t,j+1);
                    break;//从第一个箱子开始遍历,若当前箱子能够容纳该物品,则输出物品大小和箱子序号,并跳出当前循环;
                }
                
                if(j==k-1)
                {//如果遍历到最后一个箱子仍然无法容纳该物品,则开一个新的箱子 输出物品大小和新的箱子序号
                    a[k] = t;
                    k++;
                    printf("%d %d\n",t,k);
                    break;
                }
            }
        }
        printf("%d",k);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    7-4 数组-值钱的微信号

    总算到站了。尽管阿翔还是没有解锁出钥匙。但是who cares!听说会有学姐在火车站口迎接学弟,这才是当下最重要的事情啊!阿翔屁颠屁颠地跑向站口……

    “胡大的同学请到这里来。”然而并没有学姐。阿翔看着这一个个英俊潇洒的帅比学长,失望极了。这时他注意到了旁边的那支队伍,怎么那么多学姐!她们右肩扛着学弟的行李,左肩扛着大旗,旗上还绣着fjnu。阿翔暗想,他要加入那支队伍,不然至少也得要几个微信号。忽然,他觉得身后传来阵阵杀气,扭头一看,学长们的眼里道道寒光裹挟着邪魅。阿翔咽了咽口水,他知道,为了革命吃点苦,是在所难免的了——

    阿翔的钱包里共有K枚金币。这里有N个学长,每贿赂一个学长i,阿翔就能获得一个学姐的微信号,但是要消耗Bi枚金币。阿翔想在钱包还没被掏空的情况下得到尽可能多的微信号(注:钱包里的钱是一定不能花光的,至少也得给自己留一枚金币嘛!人生最大的悲剧莫过于积了一页的微信号,却没钱买流量!),问:阿翔最多能要到多少个微信号?
    输入格式:

    第一行为两个正整数 K(0 < K <= 100) 和 N(0 < N <= 50),表示阿翔共有K枚金币,这里共有N个学长。

    第二行有N个整数Bi(0 <= Bi <= 100),表示贿赂第i个学长所需要消耗的金币数。

    相邻两个整数间用空格隔开。
    输出格式:

    输出仅一行,即阿翔所能得到的最多的微信号数目。
    输入样例:

    20 10
    10 9 8 7 6 5 4 3 2 1

    输出样例:

    5

    #include 
    
    int main()
    {
        int k,n;
        scanf("%d%d",&k,&n);
        long long int a[n];
        for(int i=0;i<n;i++)
        {
            scanf("%lli",&a[i]);
        }
    
        for(int i=0;i<n-1;i++)
        {
            for(int j=0;j<n-1-i;j++)
            {
                if(a[j]>a[j+1])
                {
                    int t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
            }
        }
    
        int sum=0;
        for (int i=0;i<n;i++)
        {
            sum+=a[i];
            if(sum>=k)
            {
                printf("%d",i);
                break;
            }
            if(i==n-1&&sum<k)//最后一位学长
            {
                printf("%d",n);
            }
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    7-5 数组-吹泡泡

    Shc特别喜欢吹泡泡,他现在已经吹出了N个泡泡,根据他多年吹泡泡的经验,他很快就目测出了每个泡泡的半径(能精确到小数点后一位)。但是他的数学特别的差。 现在他想知道每个泡泡的体积大小。因为shc吹泡泡的技术高超,所以每个泡泡都是绝对的球体。你能帮助他求出每个泡泡的体积大小,并且从大到小输出吗?并且在输出体积的同时也请输出这个泡泡是shc吹的第几个泡泡。
    输入格式:

    第一行为一个正整数N(0 < N <= 1000),表示有N个泡泡。

    接下来N行按吹泡泡的顺序每行输入一个半径r (r 为1到100的任意实数)

    注意: Pai = 3.14

    4/3 = 1.33
    输出格式:

    输出共N行,每行两个数字,第一个数字为泡泡的体积(保留两位小数),第二个数字表示泡泡的编号。两个数字之间用一个空格分隔。

    注:如果两个泡泡的体积相同,应保证编号小的泡泡在前。
    输入样例:

    3
    1.2
    2.4
    3.1

    输出样例:

    124.41 3
    57.73 2
    7.22 1

    #include 
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	double a[n];//储存体积
    	int b[n];//储存编号
    	for(int i=0;i<n;i++)
    	{
    		scanf("%lf",&a[i]);
    	}
    	
    	for(int i=0;i<n;i++)
    	{
    		a[i]=1.33*3.14*a[i]*a[i]*a[i];//编号为1、2、3...的泡泡体积
    	    b[i]=i+1;
    	}
    	
    	//使用冒泡排序按照体积降序排序,同时保持编号顺序不变
    	for(int i=0;i<n-1;i++)
    	{
    		for(int j=0;j<n-i-1;j++)
    		{
    			if(a[j]<a[j+1])
    			{
    				double t=a[j];
    				a[j]=a[j+1];
    				a[j+1]=t;
    				
    				int s=b[j];
    				b[j]=b[j+1];
    				b[j+1]=s;
    			}
    		}
    	}
    	
    	for(int i=0;i<n;i++)
    	{
    		printf("%.2f %d\n",a[i],b[i]);
    	}
    	return 0;
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    7-6 数组-数学鬼才

    As we know,HHD is a 数学鬼才。

    这一天他为了给学弟学妹们展示他的计算能力,他决定口算阶乘。对于给出的每个N,他都会立刻算出N!的值。但是由于N!一般比较大,所以他只说出对2018取模的结果,即N!%2018。但是他发现看他表演的只有学弟,没有迷妹,所以他决定把这个任务交给你。
    输入格式:

    第一行输入一个正整数Q(0

    接下来Q行,每行一个N(0 < N <= 10^17)。
    输出格式:

    输出共Q行,每行对应一次询问,输出一个整数,即N!对2018取模的结果。
    输入样例1:

    2
    4
    6

    输出样例1:

    24
    720

    输入样例2:

    1
    19

    输出样例2:

    2000

    #include 
    #include 
    int main()
    {
    	int q,sum=1;
    	scanf("%d",&q);
    	
    	for(int i=1;i<=2018;i++)
    	{
    		sum=(sum*i)%2018;
    	}//先计算2018的阶乘并对其取余 为后面做铺垫
    	
    	
    	
    	for(int i=1;i<=q;i++)
    	{
    		long long int n;
    		scanf("%lli",&n);
    		
    		int t=1;
    		if(n>2018)//如果输入的数大于2018,则将大数拆分为2018的倍数和余数
    		{
    			int s=n/2018;
    			n%=2018;
    			t=(t*(int)pow(sum,s))%2018;
    		}
    		
    		for(int i=1;i<=n;i++)
    		{
    			t=(t*i)%2018;
    		}
    		printf("%d\n",t);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    添加阈值滞后以实现平滑的欠压/过压锁定
    App自动化测试持续集成效率提高50%
    常用CMD命令
    8.5 Windows驱动开发:内核注册表增删改查
    如何理解springboot的自动注入
    Elasticsearch基础篇(四):Elasticsearch7.x的官方文档学习(Set up Elasticsearch)
    关于#SP#的问题,如何解决?(关键词-上拉)
    C++多线程学习(二):多线程通信和锁
    CMSC5707-高级人工智能之特征表示和压缩
    阶段七-Day01-SpringMVC
  • 原文地址:https://blog.csdn.net/2301_77485708/article/details/134296452