作者:会敲代码的Steve
座右铭:博学笃志,切问静思。
大家好久不见啊,一看时间我已经好久没发文章了,最近在刷OJ题和学习;就没那么多心思把时间花在写文章上了,我对此感到很抱歉,本文呢,想总结一下自己最近做过的题目,分享心得。
正文起:
目录
作者:会敲代码的Steve
1. 2830: 数字统计
2. 2240: 蓝桥杯算法训练-删除数组零元素
3. 数字的处理与判断
4.1036 :指针传址调用 -C语言
5. 2804: 与指定数字相同的数的个数
6. 2798: 整数序列的元素最大跨度值
7.2799: 奥运奖牌计数
8. 2819: 数字反转
9.2883: 矩阵加法
10. 2823: 计算分数加减表达式的值
分析:
题目是要求数字2出现的次数,那我们可以对大于9的数字取出个位和十位来判断是否是2,如果是2的话,那计数器就+1;具体呢就这个逻辑,那我们来看代码怎么实现。
#include
int main(){
int n,x,i,count=0,t;
scanf("%d %d",&x,&n);
for(;x<=n;x++){
int j=x;
while(j>0){
t=j%10;
if(t==2)
count++;
j=j/10;
}
}
printf("%d",count);
}
这道题就写完了。
分析:
题目要求是定义一个函数Compactlntegers,来删除数组中的0,让元素向前面移动;知道条件,那就很好办了,先定义函数Compactlntegers,分别传入数组和数组的长度,然后进行遍历;如果是0的话后面的数字就等于前面的数字(覆盖),同时不等于0时计数器+1,函数返回值就是删除0后数组元素的数量,主函数内输出结果,这题就做完了。
#include
void CompactIntegers();
int main() {
int t = 0;
int a[100] = {0};
int b[100] = {0};
int n, count = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", a + i);
if(a[i]!=0)
{
a[t]=a[i];
t++;
}
}
printf("%d\n",t);
for(int i = 0;i
分析:
题目很简单,就是分别求几位数和分离每一位数字,然后就是逆序打印数字。
我们上代码:
#include
int count(int y);
void print(int x);
void func(int z);
int main()
{
int a;
scanf("%d",&a);
printf("%d\n",count(a));
print(a);
printf("\n");
func(a);
return 0;
}
void print(int x)
{
if(x>9)
{
print(x/10);
}
printf("%d ",x%10);
}
int count(int y)
{
int count = 0;
while(y!=0)
{
y= y/10;
count++;//这里是求几位数
}
return count;
}
void func(int z)
{
if(z<10)
{
printf("%d",z);
return;
}
printf("%d",z%10);
func(z/10);
}
分析:
这道题主要是需要会指针的传引用,指针交换变量,上代码!
#include
int main()
{
int swap(int *a,int *b);
int a,b;
scanf("%d%d",&a,&b);
int *p1=&a;
int *p2=&b;
swap(p1,p2);
printf("%d %d",a,b);
return 0;
}
int swap(int *a,int *b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
return 0;
}
不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所知变量的值
分析:
这道题可以很好的用数组来做,首先按照题目要求输入N,再输入N个数字;在for循环内遍历,如果是指定的数字m那么计数器就不断+1,直到遍历完整个数组为止。
#include
int main()
{
int arr[100]={0};
int n,i;
int cnt,count,cut;
cnt = 0,count = 0,cut = 0;
scanf("%d",&n);
for(i = 0;i
分析:
这道题依旧是数组来解决,我们首先定义最大值(max)和最小值(min),然后把这两个值定义为数组第一个元素,在数组内遍历,如果当前数字比max或min小那么max和min就是该数字。结果相减即可得到。我们来看代码:
#include
#include
#include
#define N 1000
int main() {
int arr[N] = {0};
int n, max, min;
int i = 0;
int sum = 0;
scanf("%d", &n);
for (i = 0; i < n;i++) {
scanf("%d", &arr[i]);
}
max = 0, min = 0;
max = arr[0];
min = arr[0];
for (i = 0; i < n; i++) {
if (maxarr[i]) {
min = arr[i];
}
}
sum = max - min;
printf("%d",sum);
}
分析:
这次就用不上数组了哦,定义三个变量输入,四个sum,依次相加输出就做完了,但是不能忽略的一点是不要忘记初始化变量。
#include
#include
int main()
{
int n;
int a,b,c;
a = 0,b = 0,c = 0;
int sum1,sum2,sum3;
sum1 = 0,sum2 = 0,sum3 = 0;
int sum = 0;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
{
scanf("%d%d%d",&a,&b,&c);
sum1+=a;
sum2+=b;
sum3+=c;
}
printf("%d %d %d %d\n",sum1,sum2,sum3,sum1+sum2+sum3);
return 0;
}
分析:
这道题主要是分解每一位数字然后再次逆序打印出来,具体用while循环实现。
#include
void kr(int n);
int main()
{
int n;
scanf("%d",&n);
kr(n);
}
void kr(int n)
{
int s;
s = 0;
while(n!=0){
s=s*10+n%10;
n=n/10;
}
printf("%d",s);
}
分析:
定义三个数组,两个数组全部输入完成后相加后赋值个第三个数组,之后打印即可。
#include
int main()
{
int arr[100][100];
int brr[100][100];
int crr[100][100];
int a,b,i,j;
scanf("%d%d",&a,&b);
for(i = 0;i
分析:
重点在于我们需要定义一个变量来控制正负,每循环一次就颠倒一次正负。
下面是代码:
#include
int main()
{
int i,j;
int sign = 1;
double sum = 0;
scanf("%d",&j);
for(i = 1;i<=j;i++)
{
sum+=(double)sign*1/i;
sign = -sign;
}
printf("%.4lf",sum);
return 0;
}