P1042 [NOIP2003 普及组] 乒乓球
思路:简单模拟题
这里的“模拟”不是指模拟某场比赛的模拟题,而是指让程序完整的按照题目叙述的方式执行运行得到最终答案。同时也会介绍可以计算很大整数的高精度运算方法。这一章对思维与算法设计的要求不高,但是会考验编程的基本功是否扎实。
#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){
int a[62501];//这个用来测记录赢还是输,赢为1,输为0。
//25*2500=62500
int cnt=0;
int i,j;
char s[25];
while(i++){//一直输入字符串一直到某个字符串里出现'E'
scanf("%s",s);//输入
for( j=0; j<strlen(s);j++){
if( s[j]=='W'){ //如果W华华得一分
a[cnt]=1;//cnt表示对局次数,值表示胜利者,1为华华0为对手胜利
}else if( s[j]=='L'){
a[cnt]=0;
}else if( s[j]=='E'){
break;
}
cnt++;
}
if( s[j]=='E') break;
}
int az=0,bz=0;
//11分制
for(i=0;i<cnt;i++){
if(a[i]==1) az++;
else if(a[i]==0) bz++;
if((az>=11||bz>=11)&&fabs(az-bz)>=2){//这个是最值得注意的,思考一下
printf("%d:%d\n",az,bz);
az=0;bz=0;
}
}
printf("%d:%d\n",az,bz);
//22分制
printf("\n");
az=0;bz=0;
for(i=0;i<cnt;i++){
if(a[i]==1) az++;
else if(a[i]==0) bz++;
if((az>=21||bz>=21)&&fabs(az-bz)>=2){
printf("%d:%d\n",az,bz);
az=0;bz=0;
}
}
printf("%d:%d\n",az,bz);
return 0;
}
2-扫雷
#include<stdio.h>
#include<string.h>
int main()
{
char a[101][101];
int n,m;
int sum;
scanf("%d%d",&n,&m);
// printf("%d%d\n",n,m);
for(int i=0; i<n; i++)
{
scanf("%s",&a[i]);
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
sum=0;
if(a[i][j]=='?')
{
for(int k=i-1; k<=i+1; k++)
for(int l=j-1; l<=j+1; l++)
{
if(a[k][l]=='*')
sum++;
}
a[i][j]=sum+'0';
}
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
return 0;
}
3-P1563 [NOIP2016 提高组] 玩具谜题
0^ 0=1^ 1=0;
0^ 1=1^0=1
#include<stdio.h>
int main()
{
char a[100001];
long n,m,i,sum=0,x,y;
char b[100000][11];
scanf("%ld%ld",&n,&m);
for(i=0;i<n;i++)
{
scanf("%ld%s",&a[i],b[i]);
}
for(i=0;i<m;i++)
{
scanf("%ld%ld",&x,&y);
if(!a[sum]^x)
{
y*=-1;
}
sum=(sum+n+y)%n;
}
printf("%s",b[sum]);
return 0;
}
4
#include<stdio.h>
#include<string.h>
int main()
{
char a[600],b[600];
int c[600],d[600],e[600];
scanf("%s",a);
scanf("%s",b);
int l1=strlen(a);
int l2=strlen(b);
int l=l1>l2?l1:l2;
//printf("%d",l);
if(l1<=l2)
{int ll=0;
for(int i=0; i<l2-l1; i++)
c[i]=0;
for(int j=l2-l1; j<l; j++)
c[j]=a[ll++]-'0';
//for(int i=0;i<l;i++)
// printf("%d",c[i]);
for(int i=0;i<l2;i++)
d[i]=b[i]-'0';
//for(int i=0;i<l;i++)
//printf("%d",d[i]);
int n=0;
for(int i=l-1;i>=0;i--)
{
e[i]=c[i]+d[i]+n;
n=e[i]/10;
e[i]=e[i]%10;
}
if(n==1)
printf("1");
for(int i=0;i<l;i++)
printf("%d",e[i]);
}
if(l1>l2)
{
int ll=0;
for(int i=0; i<l1-l2; i++)
c[i]=0;
for(int j=l1-l2; j<l; j++)
c[j]=b[ll++]-'0';
//for(int i=0;i<l;i++)
// printf("%d",c[i]);
for(int i=0;i<l1;i++)
d[i]=a[i]-'0';
for(int i=0;i<l;i++)
printf("%d",d[i]);
int n=0;
for(int i=l-1;i>=0;i--)
{
e[i]=c[i]+d[i]+n;
n=e[i]/10;
e[i]=e[i]%10;
}
if(n==1)
{
printf("1");
}
for(int i=0;i<l;i++)
printf("%d",e[i]);
}
return 0;
}
5.A*B
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a1[10001],b1[10001];
int a[10001],b[10001],i,x,len,j,c[10001];
int main ()
{
scanf("%s",a1);
scanf("%s",b1);
int lena=strlen(a1);
int lenb=strlen(b1);
for(i=1;i<=lena;i++)
a[i]=a1[lena-i]-'0';
for(i=1;i<=lenb;i++)
b[i]=b1[lenb-i]-'0';
for(i=1;i<=lenb;i++)
for(j=1;j<=lena;j++)
c[i+j-1]+=a[j]*b[i];
for(i=1;i<lena+lenb;i++)
if(c[i]>9)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
len=lena+lenb;
while(c[len]==0&&len>1)
len--;
for(i=len;i>=1;i--)
printf("%d",c[i]);
return 0;
}
6阶乘
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
int a[100000],n,i,y,c[100000],s[100000];
int la,ls,lc;
void add()
{
int i;
memset(c,0,sizeof(c));
lc=fmax(ls,la);
for (i=1;i<=lc;i++)
{
c[i]+=s[i]+a[i];
c[i+1]=c[i]/10;
c[i]%=10;
}
while (c[lc+1]>0)
{
c[lc+2]=c[c[0]+1]/10;
c[lc+1]%=10;
lc++;
}
ls=lc;//长度也要更新
for (i=1;i<=lc;i++)
s[i]=c[i];//将c给s
}
int main()
{
scanf("%d",&n);
la=1;
a[1]=1;
ls=1;
s[1]=0;
for (y=1;y<=n;y++)
{
memset(c,0,sizeof(c));
lc=la;
for (i=1;i<=la;i++)
{
c[i]+=a[i]*y;
c[i+1]=c[i]/10;
c[i]%=10;
}
///再进位;
while(c[lc+1]>0)
{
c[lc+2]=c[lc+1]/10;
c[lc+1]%=10;
lc++;
}
///更新了求得阶乘的长度
for (i=1;i<=lc;i++)
a[i]=c[i];
la=lc;
add();
}
for (i=ls;i>=1;i--)
printf("%d",s[i]);
printf("\n");
return 0;
}