每日两小时编程之旅(四)
每日两小时编程之旅(四)
洛谷篇(算法1-1 模拟与高精度)
P1042乒乓球
#include<bits/stdc++.h>
using namespace std;
int win[62503];
int w,l;
int main()
{
char s;
for(int i=1;cin>>s&&s!='E';i++)//循环读入,当读到字符E结束
{
if(s=='W')win[i]=1;
else win[i]=2;
}
//----------------11分制 ----------------
for(int i=1;1;i++)
{
if(win[i]==1)w++;//胜场+1
if(win[i]==2)l++;//负场+1
if(win[i]==0)//读到0则记录结束,输出记录结束前的分数。
{
cout<<w<<":"<<l<<endl<<endl;
break;
}
if(w-l>=2||l-w>=2)
if(w>=11||l>=11)//当双方比分相差大于2且一方分数大等于11输出
{
cout<<w<<":"<<l<<endl;
w=0;//比分清零
l=0;
}
}
w=0;//清零,为21分制计算做准备
l=0;
//----------------21分制 ----------------
for(int i=1;1;i++)//一切同上,唯一区别就是判定从11变为21
{
if(win[i]==1)w++;
if(win[i]==2)l++;
if(win[i]==0)
{
cout<<w<<":"<<l;
break;
}
if(w-l>=2||l-w>=2)
if(w>=21||l>=21)//11变为21
{
cout<<w<<":"<<l<<endl;
w=0;
l=0;
}
}
return 0;//华丽地结束 ㄟ(▔▽▔)ㄏ
} P2670扫雷游戏(easy)
#include<bits/stdc++.h>
using namespace std;
int n,m;
char str;
bool a[110][110];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>str;
if(str=='*') a[i][j]=1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]==1) cout<<"*";
else
{
printf("%d",a[i-1][j-1]+a[i-1][j]+a[i-1][j+1]+a[i][j-1]+a[i][j+1]+a[i+1][j-1]+a[i+1][j]+a[i+1][j+1]);
}
}
cout<<endl;
}
return 0;
} P1563玩具谜题
#include<bits/stdc++.h>//万能头文件
using namespace std;
int n,m,kk=0;//n表示人数,m表示指令数,kk表示当前的编号
char name[1000100][20];//人物姓名
bool key[1000100];//朝圈内还是圈外站>
int x[1000100],y[1000100];
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>key[i]>>name[i];
}
for(int i=0;i<m;i++)
{
cin>>x[i]>>y[i];
if(x[i]==key[kk]) //二者相等顺时针转,反之逆时针转
{
kk=kk-y[i]+n;
kk%=n;
}
else
{
kk=kk+y[i]+n;
kk%=n;
}
}
cout<<name[kk];//保存编号输出即可
return 0;
} P1601A+B Problem(高精)
#include<bits/stdc++.h>
using namespace std;
char a[550],b[550];
int m[550],n[550];
int main()
{
cin>>a>>b;
int lena=strlen(a);//a长度
int lenb=strlen(b);//b长度
int len=max(lena,lenb);//二者中长的那个
for(int i=0;i<lena;i++)
{
m[i]=a[lena-i-1]-'0';//倒序赋值
}
for(int i=0;i<lenb;i++)
{
n[i]=b[lenb-i-1]-'0';
}
for(int i=0;i<len;i++)//注意进位
{
m[i]+=n[i];
m[i+1]+=m[i]/10;
m[i]%=10;
}
if(m[len]) len++;//最高位可能不是len-1;
for(int i=len-1;i>=0;i--)
{
cout<<m[i];
}
return 0;
} P1303A*B Problem
#include<bits/stdc++.h>
using namespace std;
char a1[50001],b1[50001];
int a[50001],b[50001],i,x,len,j,c[50001];
int main ()
{
cin >>a1 >>b1;//读入两个数
a[0]=strlen(a1);b[0]=strlen(b1);//计算长度
for (i=1;i<=a[0];++i)a[i]=a1[a[0]-i]-'0';//将字符串转换成数字
for (i=1;i<=b[0];++i)b[i]=b1[b[0]-i]-'0';
for (i=1;i<=a[0];++i)for (j=1;j<=b[0];++j)c[i+j-1]+=a[i]*b[j];//按乘法
len=a[0]+b[0]; //原理进行高精乘
for (i=1;i<len;++i)if (c[i]>9){c[i+1]+=c[i]/10;c[i]%=10;}//进位
while (c[len]==0&&len>1)len--;//判断位数
for (i=len;i>=1;--i)cout <<c[i];//输出
return 0;
} P1009阶乘之和
#include<bits/stdc++.h>//高精度乘法+高精度加法
using namespace std;
int n,a[90],b[90],c[90],f[90],d=0,len_a,len_b=1,len_c=1,len_ans,m=1;
string s;
int main()
{
cin>>n;
b[0]=1; //初始化
for(int i=1;i<=n;i++){ //计算i的阶乘,已经算好了i-1的阶乘
len_a=0; //i的长度
int p=i;
while(p>0){ //把i存进a数组
a[len_a++]=p%10;
p/=10;
}
for(int j=0;j<len_a;j++) //计算a*b(i*(i-1)的阶乘),即i的阶乘,看不懂的网上查,我也不知道为什么
for(int k=0;k<=len_b;k++)
c[j+k]+=a[j]*b[k];
for(int j=0;j<len_c;j++) //需要进位的就进位
if(c[j]>9) c[j+1]+=c[j]/10,c[j]%=10;
if(c[len_c]) len_c++; //看最高位要不要进位
len_ans=len_b,len_b=len_c,m=max(m,len_c); //把len_b赋值给len_ans,修改len_b的值,m为i阶乘的长度,看有没有进位
for(int k=len_c-1;k>=0;k--) b[k]=c[k]; //把c存进b数组,即存进i的阶乘,下次循环b为i-1的阶乘
len_c=len_a+len_ans;
memset(c,0,sizeof(c)); //清零c数组,准备计算下个阶乘
for(int j=0;j<m;j++){ //高精加,直接套模板
f[j]+=b[j];
if(f[j]>9) f[j+1]+=f[j]/10,f[j]%=10; //进位,注意不要写成f[j+1]++,f[j]-=10;就因为这里wa了一个点
}
}
while(!f[m]&&m>0) m--; //去掉首导零
for(int i=m;i>=0;i--) cout<<f[i]; //倒序输出
return 0; //圆满结束
} 今天没什么好说的,明天继续加油,奥里给。
