zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言常见的习题

C语言 常见 习题
2023-09-11 14:15:52 时间

给你一串数,输出最大的数

#include<stdio.h>
int main(void)
{
	int a[5]={34,56,2,33,7};
	int i,max;
	max=0;
	for(i=0;i<5;i++)
	{
		if(a[i]>a[max])
		 max=i;
	}
	printf("%d\n",a[max]);
    return 0;
}

输出1-n之间的质数

#include<stdio.h>
#include<math.h>
void bool_number(int n);
int main(void)
{
	int n=100;
	bool_number(n);
	return 0;
}
void bool_number(int n)
{
	int i,j;
	int temp=1;
	printf("2 ");
	for(i=3;i<=n;i++)
	{
		temp=1;//判断是不是质数
		for(j=2;j<=sqrt(i);j++)
		{
			if(i%j==0)//只要能整除,直接跳出来
			{
			 temp=0;
			 break;
			}
		}
		if(temp==1)
		printf("%d ",i);
	}
}

为啥判断一个数是不是质数,判断除数从2到 n开根号就行了?
我们以36为例,它的因子有:1,2,3,4,6,9,12,18,36。
1和36,2和18,3和12,4和9,各为一对,6单独。
成对的因子都是关于6 对称的 ,而 6是 36开方得到的。所以判断一个数是不是质数,判断除数从2到 n开根号就行了。

下面从几何的方向上看:
在这里插入图片描述
面积为36的长方形关于红线对称(也可以说关于,以36开方为边长的正方形对称)。

剔除掉多余的空格

一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。

例:helllo   word           c    剔除后:hello word c
#include<stdio.h>
#include<string.h>
int main(void)
{
    char a[201];//输入的数据
    int i=1;
    gets(a);
    printf("%c",a[0]);
    while(a[i]!='\0')
    {
        if(a[i-1]==' '&&a[i]==' ')//如果当前位置和前面的都是空格就不输出
        {
            i++;
            continue;
        }
        else
        printf("%c",a[i]);
        i++;
    }
    return 0;
}

用递归计算1~n的和

#include<stdio.h>
int fun(int n);
int main(void)
{
	printf("%d",fun(10));
	return 0;
}
int fun(int n)
{
	return (n==1) ? 1:(n+fun(n-1));
}

计算过程:
先判断 10是否等于 1 不等于执行后面的 即 10+fun(9)
再计算 10+fun(9) 即 10+9+fun(8) 这时候上面的 fun(9)=9+fun(8)


即: 10+9+8+…+1

统计单词序列,每个单词的长度

输入一行单词序列,相邻单词之间有1个或多个空格间隔,请对应地计算各个单词的长度。
注意,如果有标点符号(如连字符,逗号,句号),标点符号算作与之相连的词的一部分。没有被空格间隔开的符号串,都算作单词。

例:

  • 输入:She was born in 1990-01-02 and from Beijing city.
  • 输出: 3,3,4,2,10,3,4,7,5
#include<stdio.h>
#include<string.h>
int main(void)
{
    char a[1020];
    int i;
    int count=0;
    gets(a);
    for(i=0;a[i]!='\0';i++)
    {
        if(a[i]!=' ')//如果不是空格就加1
        {
            count++;
        }
        if(a[i]==' '&&a[i+1]!=' ')//如果是空格且下一个不是空格就输出
        {
            printf("%d,",count);
            count=0;//开始下一个单词的计数
            continue;
        }
    }
    printf("%d",count);//最后一个统计没有输出,所以要输出。
    return 0;
}

剔除序列中重复出现的数

给定含有 nn 个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的数,
只保留该数第一次出现的位置,删除其余位置。
例:   12   34   78  12   66
剔除后:  12   34   78  66
#include<stdio.h>
int main(void)
{
    int n;
    int i=0;
    int j=0;
    int a[20000]={0};
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)//从这个位置后面的所有数中查找
        {
            if(a[i]==a[j])//如果重复赋值为-1 ,输出时只要输出非-1的就可以了
            {
                a[j]=-1;
            }
        }
    }
    for(i=0;i<n;i++)
    {  
       if(a[i]!=-1)
        printf("%d ",a[i]);
    }
    return 0;
}

把一个十进制正整数转化成八进制。

#include<stdio.h>
int main(void)
{
    int number=0;
    int a[100]={0};//存储数据
    int n=0;//保存位数
    int i=0;
    scanf("%d",&number);
    while(number>0)
    {
        a[i]=number%8;
        number=number/8;
        i++;//下标加1
        n++;//位数加1
    }
    for(i=n-1;i>=0;i--)//倒着输出,因为保存的时候是从后向前保存的。
    {
        printf("%d",a[i]);
    }
    return 0;
}

统计一个数转化为二进制后1的个数

//这个是我做题的时候遇到的一个比较巧妙的方法
int func(int x){
    int count=0;
    while (x)
    {
        count++;
        x=x&(x-1);//与运算
    }
    return count;//统计的位数
}
:15为例 
count=11111 & 1110   结果  1110
count=21110 & 1101   结果  1100
count=31100 & 1001   结果  1000
count=41000 & 0111   结果  0000
不满足了  返回 统计的值