今天的博客内容是关于循环和数组的灵活使用的案例和算法题目,这俩个方面都是以后算法进阶所必须要经过的历程·,在学习考试中也是经常光顾的类型,需要好好重视。
1、整数序列的元素最大跨度值
a、这类与最大和最小的题目更高效的方法是用max和min变量不断输入不断替代
b、时间复杂度低,代码量少,算法高效
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
//核心步骤
int data,max=0,min=1000; //使用俩个变量进行替代,data数据进行输入
for(int i=0; i<n; i++){
scanf("%d",&data);//不断读取输入数据值
//输入的数据不断进行替代(即max和min)
if(max < data) max = data;
if(min > data) min = data;
}
//max和min便是最大和最小值,便得到最大元素跨度
printf("%d\n",max-min);
return 0;
}
2、奥运奖牌计数
a、如果需要连续输入的是一个物件的数量而计算的时候也是对这个变量进行计算,就得使用俩个变量,一个作为输入量(输入一个就会对这个变量赋值)、另一个就是输出量/结果量(对它进行数字运算)
#include<stdio.h>
int main()
{
int n,g,s,b;
//n为A国参与决赛项目的天数,g,s,b分别为A国所获得的金、银、铜牌
scanf("%d",&n);
int gold=0,silver=0,bronze=0,sum=0;
//这里是核心代码,因为最终展示的就是金银铜牌,但又需要对金银铜牌数量进行输入,所以需要增加变量g\s\b
for(int i=0; i<n; i++){
scanf("%d %d %d",&g,&s,&b);
gold = gold + g;
silver = silver + s;
bronze = bronze + b;
}
sum = gold + silver + bronze;
printf("%d %d %d %d\n",gold,silver,bronze,sum);
return 0;
}
3、计数器思想
a、计数器思想一般用于计算某个物件在某集合中出现过的次数(一般就是满足条件之后就加一)
4、计算书费
a、这里涉及一般循环情况下数组对象的使用,一般来讲对固定已知的数据使用数组存储更加高效简便
#include<stdio.h>
int main() {
float book[10]={0};
float p[10]={0};
float sum=0;
//这道题目的最核心的点就是对哪类变量使用数组存储数据,一般来讲对于固定已知数值的设为数组(在循环使用中)更加方便
p[0]=28.9;
p[1]=32.7;
p[2]=45.6;
p[3]=78;
p[4]=35;
p[5]=86.2;
p[6]=27.8;
p[7]=43;
p[8]=56;
p[9]=65;
for (int i=0;i<=9;i++) {
scanf("%f",&book[i]);
sum+=p[i]*book[i];
}
printf ("%.1f",sum);
return 0;
}
5、校门外的树
a、这里使用的算法思想很优质,因为要输出的答案是剩下树的数量,可以把使用了的树(ture)数量计数器累加起来,然后再减,也可以按照下面的源码一样,直接对不需要使用的树(false)使用计数器累加,从而直接得到答案
b、对数组类型使用bool类型,因为树是一类数据,但在这个案例中,树的命运只有使用和不使用,然后通过其使用和不使用所导出的ture和false不同使用if进行计数器计算结果
#include<iostream>
using namespace std;
bool a[10005];//因为数组类型是bool类型的,所以只有俩种数据,一个是ture,另一个是false,而bool类型的默认数据值是false,后面可以根据这个进行if判断
int l,m;
int x,y;
int ans;
int main() {
cin>>l>>m;
for(int i=1; i<=m; i++) {
cin>>x>>y;
//对数组中合适的设定为ture
for(int j=x; j<=y; j++) {
a[j]=true;
}
}
//由0-L的树的数量进行计算false的数量
for(int i=0;i<=l;i++){
if(a[i]==false){
ans++;
}
}
cout<<ans;
return 0;
}
6、石头剪刀布
a、这个最大的不同就是不能直接进行比较大小,因为石头剪刀布不是一般的数据处理,无法直接比较谁赢谁输。这套源码使用的方法就是
b、石头剪刀布这三个指标需要用一种东西进行替代,
c、因为每一轮会相互比拳,所以因为轮次数是一样的,我们因此可以使用俩个数组分别储存俩个人的出拳规律,之后循环比较的时候更好比较
#include<stdio.h>
int main()
{ //初始化变量:n(比赛轮数),na(a出拳规律的周期),nb(b出拳规律的周期),j,k(循环变量),naj、nbj分别为a和b胜利的轮数
int n,na,nb,i,j=0,k=0,naj=0,nbj=0;
scanf("%d %d %d",&n,&na,&nb);
//使用数组将周期内a和b的出拳类别进行记录,
//核心代码一
int nac[na],nbc[nb];
for (i=0;i<na;i++)
scanf("%d",&nac[i]);
for (i=0;i<nb;i++)
scanf("%d",&nbc[i]);
//核心代码二:之如何计算某一方胜利
for(i=0;i<n;i++,k++,j++)
{ //因为数组存储的时候只有相对应的一轮的数据,所以当其中某一方的数据值到了最大后,又需要重新设0。因为有俩组数据,所以需要加入俩个计数器(j、k)
if(j==na||k==nb)
{
if(j==na)
j=0;
if(k==nb)
k=0;
}
//因为石头剪刀布不能直接通过数值大小来进行比较,所以需要俩方所展示的条件来判断谁赢
if(nac[j]==0&&nbc[k]==2)
naj++;
else if(nac[j]==2&&nbc[k]==0)
nbj++;
else if(nac[j]==0&&nbc[k]==5)
nbj++;
else if(nac[j]==5&&nbc[k]==0)
naj++;
else if(nac[j]==5&&nbc[k]==2)
nbj++;
else if(nac[j]==2&&nbc[k]==5)
naj++;
}
//最后相互之间谁赢的判断指标是naj和nbj的大小,即赢得盘数的大小
if(naj>nbj)
printf("A");
else if(naj<nbj)
printf("B");
else if(naj==nbj)
printf("draw");
return 0;
}
7、大整数加法
a、涉及大整数,无法使用各类int、double等数据类型进行处理,但可以使用数组进行处理
#include <iostream>
using namespace std;
const int LN=202;
int a[LN],b[LN],c[LN];
int main(){
//使用字符串来替代大整数的输入
string s1,s2;
cin>>s1>>s2;
//核心代码一
//s1[]:其实s1是字符串,但也可以直接使用数组的下标方法得到对应位置的数字字符,然后再进行字符相减再存储在一个数组中(关于这里为什么减了一个数组零)
a[0]=s1.length();
for(int i=1;i<=a[0];i++) a[i]=s1[a[0]-i]-'0';
b[0]=s2.length();
for(int i=1;i<=b[0];i++) b[i]=s2[b[0]-i]-'0';
//创建一个新数组来存储俩个大整数相加的后的字符串
//核心代码二
int i;
for(i=1;i<=a[0] || i<=b[0];i++){
c[i]=a[i]+b[i]+c[i];
//因为考虑到俩个同位字符相加大于10进位,所以将进位的数值记录在下一个字符中,即c[i+1]中,然后未进位的那部分的数值(对其求余之后)就放入c[i]中
c[i+1]=c[i]/10;
c[i]%=10;
}
//记录c[0]的大小
while(!c[i] && i>=1) i--;
c[0]=i;
//由尾到头部输出字符
for(i=c[0];i>=1;i--)
cout<<c[i];
return 0;
}
好了,今天的这个项目到这里就结束了,希望这些代码和总结对你有所帮助。我是极客派,向着更高更远的互联网技术不断迈进的一个平凡的人,有幸与你一同成长......持续更新.......欢迎关注哦~~~