C语言_0307练习_8章|数组定义/循环scanf不能加空格/二维数组的定义 赋值和应用

文章包含了四个编程问题,分别涉及数组中的整数查找,统计一组整数中最常出现的个位数字,寻找矩阵的局部极大值,以及组合数字成最小数。每个问题都提供了C语言的代码实现,涉及数组初始化、遍历、条件判断等编程概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用数组的两种情况:

08-0. 查找整数(10)

本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。

输入格式:

输入在第1行中给出2个正整数N(<=20)和X,第2行给出N个整数。数字均不超过长整型,其间以空格分隔。

输出格式:

在一行中输出X的位置,或者“Not Found”。

#include <stdio.h>

    int main()
    {
        int n,x;
        int shuzi,sig=0,cnt=0;
        const int NUMBER=20;//定义数组大小 
        int num[20]={0};
        //int num[NUMBER]={0};//定义数组并初始化 
        //[Error] variable-sized object may not be initialized
        printf("请输入两个正整数(个数和X),以空格隔开\n"); 
        scanf("%d %d",&n,&x);
        //数组赋值 跳出循环时cnt=n 
        while(cnt<n)
        {
            scanf("%d",&shuzi);
            num[cnt++]=shuzi;
        }
        //遍历数组并判断
        {
            int i;
            for(i=0;i<cnt;i++)
            {
                if(num[i]==x)
                {
                    printf("%d ",i);
                    sig=1;
                }
            }
            if(sig==0){
                printf("Not Found");
            }
         } 
         
    }

数组定义出错:

const int NUMBER=20;//定义数组大小
int num[NUMBER]={0};//定义数组并初始化
//[Error] variable-sized object may not be initialized 可变大小的对象可能无法初始化

08-1. 求一批整数中出现最多的个位数字(20)

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

输入格式:

输入在第1行中给出正整数N(<=1000),在第2行中给出N个不超过整型范围的正整数,数字间以空格分隔。

输出格式:

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

#include <stdio.h>

    int main()
    {
        int n,num;//个数和数字 
        int count[10]={0,0,0,0,0,0,0,0,0,0}; 
        int i=0;
        scanf("%d",&n);//输入在第1行中给出正整数N(<=1000)
        for(i=0;i<n;i++)
        {
            scanf("%d",&num);//在第2行中给出N个不超过整型范围的正整数,数字间以空格分隔。
            //取num里面的每一个数给数组存着 
            int j=0;
            while(num!=0)
            {
                j=num%10;
                count[j] ++;
                num=num/10;    
            }
        }
        //输出 数组里面最大的值
        {
            int i,j,k,max=0;
            int cnt=0;
            for(j=0;j<10;j++)
            {
                if(count[j]>max){
                    max=count[j];
                }
            }
            printf("%d:",max);
            //判断出现max次的 有几个数 
            for(i=0;i<10;i++)
            {
                if (count[i]==max)
                {
                    cnt++;
                }
            }
            //输出 并且保证最后末尾灭有空格 
            for(k=0;k<10;k++){
                int t=0;
                if (count[k]==max)
                {
                    printf("%d",k);
                    t++;
                    if (t!=cnt){
                        printf(" ");
                    }
                }
            }
        }
    }

输入3个数字,为什么要输入4个数字?????

scanf后面能加【空格】!!!!!

n=3;
for(i=0;i<n;i++)
{
     scanf("%d ",&num);
}
1. i=0 scan i=1; 判断i<3
2. i=1 scan i=2 判断i<3
3.i=3 scan i=3 判断 跳出

08-2. 求矩阵的局部极大值(15)

给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

输入格式:

输入在第1行中给出矩阵A的行数M和列数N(3<=M,N<=20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

输出格式:

每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

#include <stdio.h>
    int main()
    {
        int m,n;//行 列 
        scanf("%d %d",&m,&n);
        //输入矩阵
        int num[20][20]={0};
        int i,j;
        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++){
                scanf("%d",&num[i][j]);
            }
         }
        //遍历矩阵
        {
            int i,j,sig=0;
            for(i=1;i<m-1;i++)//行 循环条件在排除边界元素 
            {
                for(j=1;j<n-1;j++){//列 循环条件在排除边界元素 
                    if(num[i][j]>num[i-1][j]&&
                    num[i][j]>num[i+1][j]&&
                    num[i][j]>num[i][j-1]&&
                    num[i][j]>num[i][j+1])
                    {
                        sig=1;
                        printf("%d %d %d\n",num[i][j],i+1,j+1); //i j是数组下标位置,要输出正确位置就是要+1 
                    }
                }
             }
             if(sig==0){
                 printf("None ");
                 printf("%d %d",m,n);
             }
        }
         
          
    }

08-3. 组个最小数 (20)

给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。

现给定数字,请编写程序输出能够组成的最小的数。

输入格式:

每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。

输出格式:

在一行中输出能够组成的最小的数。

#include <stdio.h>
    int main()
    {
        int i,n;
        int num[10]={0};
        for(i=0;i<10;i++){
            scanf("%d",&n);
            num[i]=n;
        }
            //printf("%d",num[5]) ;
        //遍历数组 首位不为0  
        {
            int i,t;
            for(i=1;i<10;i++){//从1开始遍历 保证首位不为0 
                if(num[i]!=0){
                    printf("%d",i);
                    num[i]=num[i]-1;
                    //printf("%d",num[i]);
                    break;
                } 
            } 
            for(t=0;t<10;t++)//遍历不为0 输出num[t]次 
            {
                if(num[t]!=0){
                    int j;
                    for(j=0;j<num[t];j++)
                    {
                        printf("%d",t);
                    }
                }
            }
         } 
    
     } 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值