作者:会敲代码的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;
}
上一篇:串口通信协议