xdoj数组部分1


质数求和



问题描述    
输入一个大于20的正整数p,求出正整数范围内第p个质数(或素数,大于1且只能被1和自己整除的正整数,)到第p+10个质数之和。其中,第1个质数为2,第2个质数为3,第3个质数为5,第4个质数为7,依次类推。
输入说明    
一行输入1个整数p,20< p <150。
输出说明    
第p个质数到第p+10个质数之和。
输入样例:
21
输出样例:
1081
 
#include <stdio.h>
int isprime(int n)//判断是不是质数的函数,是的话返回1,不是返回0 
{
    int i;
    if (n <= 1) 
    {
        return 0;
    }
    if (n == 2) 
    {
        return 1;
    }
    for (i = 2; i < n; i++) 
    {
        if (n % i == 0)
        return 0;
    }
    return 1;
}
int main()

    //初始化 
    int p=0;
    int num[150]={0};
    scanf("%d",&p);
    int i=0;
    int j=0;
    int k=0;
    for(i=0;i<870;i++)
    {
        j = isprime(i);
        if(j==1)
        {
            num[k]=i;
            k++;
        }
        
    }//让数组存储150个质数
    //在这里有一个问题需要改进,是在我解决范围之外的,当i=900的时候会报出内存崩溃的错误,如何才能改进算法缩小内存占用或者扩大dev可以访问的内存。当然,这个代码在系统上仍然是正确的。 
    //计算和
    int sum=0;
    for(i=p-1;i<p+10;i++)
    {
        sum=num[i]+sum;
    } 
    
    //输出 
    printf("%d",sum);
    return 0;

 
灰度直方图


问题描述    
一幅m×n的灰度图像可以用一个二维矩阵表示,矩阵中的每个元素表示对应像素的灰度值。
灰度直方图表示图像中具有每种灰度级的象素的个数,反映图像中每种灰度出现的频率。
假设图像灰度为16级(灰度值从0-15),现给出一个矩阵表示的灰度图像,输出各级灰度的像素个数。
输入说明    
输入数据第一行为两个整数m 和n分别表示图像的宽度和高度(0<=m,n<=256),其后是n行数据,每行m个整数,分别表示图像各个像素的灰度值。
输出说明    
输出n行数据,每行数据由两个整数组成,分别表示灰度级和该灰度级像素个数,整数之间用空格分隔,灰度级输出顺序为从低到高,
如果某灰度级像素个数为0,则不输出该灰度级的统计结果。
输入样例    
5 4
0    1    0    2     8
3     4    8    5     9
12     14     10    6     7
1     15     3    6     10
输出样例    
0 2
1 2
2 1
3 2
4 1
5 1
6 2
7 1
8 2
9 1
10 2
12 1
14 1
15 1

#include <stdio.h>
int main()
{
    //输入 
    int m=0,n=0;
    int num[256][256]={0};//初始化一个数组 
    int get[16]={0};//这是一个统计数组 
    scanf("%d %d",&m,&n);
    int i=0,j=0;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&num[i][j]);
        }
    } 
    
    //统计 
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            get[num[i][j]]++;
        }
    }
    
    //输出
    for(i=0;i<16;i++)
    {
        if(get[i]!=0)
        {
            printf("%d %d\n",i,get[i]);
        }
        
    }
    
    return 0;
}

      
密码强度


问题描述    
每个人都有很多密码,你知道你的密码强度吗?假定密码由大写字母、小写字母、数字和非字母数字的符号这四类字符构成,密码强度计算规则如下:
1.    基础分:空密码(密码长度为零)0分,非空密码1分
2.    加分项1:密码长度超过8位,+1分
3.    加分项2:密码包含两类不同字符+1分,包含三类不同字符+2分,包含四类不同字符+3分
按照此规则计算的密码强度为0~5。请你设计一个程序计算给出的密码的强度。
输入说明    
输入为一个密码字符串,字符串长度不超过50个字符。
输出说明    
输出一个整数表示该密码的强度。
输入样例    
输入样例1
abcd
输入样例2
ab123
输出样例    
样例1输出:
1
样例2输出
2

#include <stdio.h>
#include <string.h> 
#include <ctype.h>
//这里需要介绍一下ctype库里包含的函数isupper islower isdigit如果是相应数据就返回一个非0值 
int main()
{
    char PW[50];
    int strength = 0;
    int u1=0,l1=0,d1=0,k=0;
    int i=0; 
    gets(PW);
    int n = strlen(PW);
    
    if(n == 0)
    {
         ;
    }
    else
    {
        strength++;
        if(n>8)
        {
            strength++;
        }
        for(i=0;i<n;i++)
        {
            if(isupper(PW[i]))
            u1=1;
            else if(islower(PW[i]))
            l1=1;
            else if(isdigit(PW[i]))
            d1=1;
            else//不要少了其他字符类型 
            k=1;
        }
        if(u1+l1+d1+k == 2)
        strength++;
        else if(u1+l1+d1+k == 3)
        strength+=2;
        else if(u1+l1+d1+k == 4)
        strength+=3;        
    }
    
    printf("%d",strength);
    return 0;

       
消除类游戏


问题描述
消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。
当有多处可以被消除时,这些地方的棋子将同时被消除。
现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。
请注意:一个棋子可能在某一行和某一列同时被消除。
输入格式
输入的第一行包含两个整数n, m,用空格分隔,分别表示棋盘的行数和列数。
接下来n行,每行m个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。
输出格式
输出n行,每行m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。如果一个方格中的棋子被消除,则对应的方格输出0,否则输出棋子的颜色编号。
样例输入1
4 5
2 2 3 1 2
3 4 5 1 4
2 3 2 1 3
2 2 2 4 4
样例输出1
2 2 3 0 2
3 4 5 0 4
2 3 2 0 3
0 0 0 4 4
样例说明
棋盘中第4列的1和第4行的2可以被消除,其他的方格中的棋子均保留。
样例输入2
4 5
2 2 3 1 2
3 1 1 1 1
2 3 2 1 3
2 2 3 3 3
样例输出2
2 2 3 0 2
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0
样例说明
棋盘中所有的1以及最后一行的3可以被同时消除,其他的方格中的棋子均保留。
评测用例规模与约定
所有的评测用例满足:1 ≤ n, m ≤ 30。


#include <stdio.h>
int main()
{
    //初始化 
    int m=0,n=0,i=0,j=0;
    scanf("%d%d",&m,&n);
    int arr[m][n],arr2[m][n];
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&arr[i][j]);
            arr2[i][j]=arr[i][j];
        }
    }
    //如果三个相等就消除,不用考虑其他的 
    for(i=0;i<m;i++)
    {
        for(j=0;j<n-2;j++)//注意这里的n-2 
        {
            if(arr[i][j] == arr[i][j+1] && arr[i][j+1] == arr[i][j+2])
            {
                arr2[i][j]=0;
                arr2[i][j+1]=0;
                arr2[i][j+2]=0;
            }
        }
    }
    for(j=0;j<m;j++)
    {
        for(i=0;i<n-2;i++)
        {
            if(arr[i][j] == arr[i+1][j] && arr[i+1][j] == arr[i+2][j])
            {
                arr2[i][j]=0;
                arr2[i+1][j]=0;
                arr2[i+2][j]=0;
            }
        }
    }
    //输出 
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            if(j!=n-1)
            printf("%d ",arr2[i][j]);
            else
            printf("%d\n",arr2[i][j]);
        }
    } 
    return 0;

      
数字排序


问题描述
  给定n个整数,请计算每个整数各位数字和,按各位数字和从大到小的顺序输出。
输入格式
  输入的第一行包含一个整数n,表示给定数字的个数。
  第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
  输出多行,每行包含两个整数,分别表示一个给定的整数和它的各位数字和。按各位数字和递减的顺序输出。如果两个整数各位数字和相同,则先输出值较小的,然后输出值较大的。
样例输入
5
101 100 999 1234 110
样例输出
999 27
1234 10
101 2
110 2
100 1
评测用例规模与约定
  1 ≤ n ≤ 1000,给出的数都是不超过10000的非负整数。


#include <stdio.h>
int get_sum(int x)
{
    int i=0,sum=0;
    do
    {
        sum = sum + x%10;
        x/=10;
    }while(x/10);
    sum = sum + x;
    return sum;
}
int main()
{
    //初始化 
    int n=0,i=0,j=0;
    scanf("%d",&n);
    int num[n]={0};
    int digit[n]={0};
    for(i=0;i<n;i++)
    {
        scanf("%d",&num[i]);
    }
    
    //计算各位和
    for(i=0;i<n;i++)
    {
        digit[i] = get_sum(num[i]);
    }
    //排序
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-1-i;j++)
        {
            if(digit[j]<digit[j+1])
            {
                int t1 = digit[j];
                digit[j] = digit[j+1];
                digit[j+1] = t1;
                int t2 = num[j];
                num[j] = num[j+1];
                num[j+1] = t2;
            }
            else if(digit[j] == digit[j+1])
            {
                if(num[j]>num[j+1])
                {
                    int t3 = num[j];
                    num[j] = num[j+1];
                    num[j+1] = t3;
                }
            }
            
        }
        
     } 
     
     //输出
    for(i=0;i<n;i++)
    {
         printf("%d %d\n",num[i],digit[i]);
    }
    return 0;

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
xdoj application是一个用于竞技编程训练和练习的平台。 首先,xdoj application提供了大量的编程题库,涵盖了各种语言和难度级别。这些题目既有经典的算法问题,也有实际应用的编程挑战,可以满足不同水平的程序员的需求。通过解题,程序员可以提高自己的编程能力和算法思维。 其次,xdoj application提供了在线的程序编译和运行环境。程序员可以直接在平台上编写和测试自己的代码,无需安装任何开发工具。这大大降低了环境配置的难度,让程序员能够更加专注于解决问题本身。 另外,xdoj application还支持代码提交和评测功能。程序员可以将自己的代码提交到平台上,系统会对其进行自动评测,并给出相应的反馈和评分。这样,程序员可以及时了解自己的代码是否正确并进行相应的优化。同时,平台上也会展示其他程序员的提交和评测结果,让程序员能够学习和借鉴其他人的解决思路和代码实现。 最后,xdoj application还提供了练习和比赛等功能。程序员可以选择不同类型的练习模式,根据自己的需求进行编程训练。同时,平台也会定期举办编程比赛,供程序员们进行交流和竞争。这些比赛既能检验程序员的编程水平,也能提供一种实战的机会,加深对编程知识的理解和应用。 总之,xdoj application是一个功能齐全且用户友好的竞技编程平台,能够帮助程序员提高编程能力、锻炼算法思维,并提供交流、学习和竞争的机会。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北の风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值