C语言常见的习题
C语言 常见 习题
2023-09-11 14:15:52 时间
C语言常见的习题
给你一串数,输出最大的数
#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=1时 1111 & 1110 结果 1110
count=2时 1110 & 1101 结果 1100
count=3时 1100 & 1001 结果 1000
count=4时 1000 & 0111 结果 0000
不满足了 返回 统计的值
相关文章
- C语言——if(0)之后的语句真的不会执行吗?
- 【C语言学习者必会的题目集锦1】巩固基础,稳步提高
- 复习C语言
- 《C语言编程初学者指南》一2.2 理解数据类型
- 《21天学通C语言(第6版•修订版)》一1.2 为何要使用C语言
- 基于C语言实现的(控制台)用户级线程库【100010648】
- 基于C语言实现高效率 IP 路由查找的内容的实验【100010466】
- 给任意边长n,打印出一个一n为边长的空心*型菱形(C语言实现)
- (第四列)C语言常见基础题型,确定不看一下?:递归函数如何使用?
- 嵌入式C语言优化小技巧
- printf()的左对齐和右对齐 —— C语言
- C语言课程设计|学生成绩管理系统(含完整代码)
- C语言实现方向余弦矩阵转欧拉角和姿态四元数
- C语言实现利用姿态四元数计算失准角
- C语言笔试题精选3---死锁发生必要条件是?