是个新手,平时刷题代码记录一下,也会记录自己错误的地方
575
A题
A+B问题
#include <cstdio>
#include <cstring>
long long to_int(char s[]) { //返回值是long long 型,不是int
int len = strlen(s);
long long r = 0;
int positive = 1;
for (int i = 0; i < len; i++) { //','就直接跳过
if (s[i] <= '9' && s[i] >= '0') {
r = r * 10 + (s[i] - '0'); //字符数组,这里的是字符,需要减去’\0’
} else if (s[i] == '-')
positive = 0;
}
if (!positive) r = -r;
return r;
}
int main()
{
char s[50], r[50];
while (scanf("%s %s", s, r) != EOF) {
long long snum, rnum;
snum = to_int(s);
rnum = to_int(r);
printf("%lld\n", snum + rnum);
}
return 0;
}
C题 有思考
#include<stdio.h>
#include<algorithm>
using namespace std;
void number(int t[],int a)
{
int i=0;
int j=1000000000,n=20;
while(n--)
{
if((a/j))
{
t[i]=(a/j);
a-=j*t[i];
i++;
j/=10;
if(a==0)
break;
/*t[i]=a%j;
t[i]=t[i]/j*10;
a-=j*t[i]/10;
j*=10;
i++;*/
}
else if(!(a/j) && j>=10)
{
j/=10;
}
}
}
long long multiplication(int a1[],int b1[])
{
int sum=0;
for(int i=0;i<20;i++)
{
for(int j=0;j<20;j++)
{
sum+=a1[i]*b1[j];
}
}
return sum;
}
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)!=EOF)
{
int a1[20],b1[20];
fill(a1,a1+20,0);
fill(b1,b1+20,0);
number(a1,a);
number(b1,b);
long long result=multiplication(a1,b1);
printf("%lld\n",result);
}
return 0;
}
E题
核心发现正循环和逆循环加起来正好等于总的路径长度和
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int N,a;
while(scanf("%d",&N)!=EOF)
{
int a[N+1];
for(int i=1;i<N+1;i++)
{
scanf("%d",&a[i]);
}
int M;
scanf("%d",&M);
while(M--)
{
int left,right;
scanf("%d %d",&left,&right);
int c1=0,c2=0,sum=0,temp=0;
for(int i=1;i<=N;i++)
{
sum+=a[i];
}
if(left>right)
{
temp=left;
left=right;
right=temp;
}
if(left<right)
{
for(int i=left;i<right;i++)
{
c1+=a[i];
}
c2=sum-c1;
if(c1>c2)
printf("%d\n",c2);
else
printf("%d\n",c1);
}
if(left==right)
printf("0");
/*for(int i=left;;i++)
{
}*/
}
}
return 0;
}
F题
bool型变量为非0即为true,输出句别忘记换行
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int T,i=0;
long long a,b,c;
scanf("%d",&T);
while(T--)
{
i++;
scanf("%lld %lld %lld",&a,&b,&c);
if((a+b)>c)
{
printf("Case #%d: true\n",i);
}
else
printf("Case #%d: false\n",i);
}
return 0;
}
G题
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int N;
while(scanf("%d",&N)!=EOF)
{
int c1=0,c2=0,c3=0,c4=0,c5=0;
int sum1=0,sum2=0,sum4=0,max5=0;
int b=0; //这是每次b更新的地方
while(N--)
{
int a; //int b=0不能放在这里
scanf("%d",&a);
//第一类 偶数和
if((a%5)==0 && a%2==0)
{
sum1+=a;
c1++;
}
//第二类 交错
if(a%5==1)
{
if(b%2==0)
sum2+=a;
else if(b%2==1)
sum2=sum2-a;
b++;
c2++;
}
//第三类 个数
if(a%5==2)
c3++;
//第四类 平均
if(a%5==3)
{
sum4+=a;
c4++;
}
//第五类最大
if(a%5==4)
{
if(a>max5)
max5=a;
c5++;
}
}
double ave=double(sum4)/double(c4);
if(c1)
printf("%d ",sum1);
else
printf("N ");
if(c2)
printf("%d ",sum2);
else
printf("N ");
if(c3)
printf("%d ",c3);
else
printf("N ");
if(c4)
printf("%.1f ",ave);
else
printf("N ");
if(c5)
printf("%d\n",max5);
else
printf("N\n");
}
return 0;
}
H题 A+B
法一
#include <cstdio>
using namespace std;
int P(long long A,int Da)
{
long long Pa=0; //这里的Pa没用long long 导致错误 ,可能是Pa在乘以10的过程中超限了
long long j=1;
int n=20000000;
//判断A能除以的位数
while(n--)
{
if(j<A)
j*=10;
if(j>A)
{
j/10;
break;
}
if(j==A)
break;
}
//判断A与Da的关系
while(j>0)
{
if((A/j)==Da)
{
Pa+=Da;
Pa*=10;
}
A-=(A/j)*j; //字母标错
j/=10;
}
Pa/=10;
return Pa;
}
int main()
{
long long A,B;
int Da,Db;
while(scanf("%lld %d %lld %d",&A,&Da,&B,&Db)!=EOF)
{
long long Pa=0,Pb=0;
Pa=P(A,Da);
Pb=P(B,Db);
printf("%d\n",Pa+Pb);
}
return 0;
}
法二
#include<stdio.h>
#include<string.h>
using namespace std;
long long p(char a[],char da)
{
int lena=strlen(a);
int c=0;
for(int i=0;i<lena;i++)
{
if(a[i]==da)
c++;
}
long long d=da-'0',num=0;
for(int i=0;i<c;i++)
{
//num=num+num*10; 不能用这个,c=2时,num在等于33后乘10加的是33,而不是3
num=num*10+d;//num总数乘10加d
}
return num;
}
int main()
{
char a[100],b[100];
char da,db;
while((scanf("%s %c %s %c",a,&da,b,&db))!=EOF)
{
// int c1=0,c2=0;
// int lena=strlen(a),lenb=strlen(b);
long long pa=0,pb=0;
pa=p(a,da);
pb=p(b,db);
printf("%lld\n",pa+pb);
}
return 0;
}
I题 石头剪刀布
这道题注意输入N后需要吸收空格,因为scanf对输入%c字符时,空格会误认为也是输入,而不是一个字符的结束标志
记录什么赢的那里的数组是整型,同时字符数组初始化可以直接赋值,不写大小,除此之外,本代码中还引入了全局数组。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char c[]={'B','C','J'}; //字符数组初始化时可直接赋值,这个数组是全局变量
char compare(int a[])
{
char m;
int k=0;
for(int i=0;i<3;i++)
{
if(a[i]>a[k])
k=i;
}
/* if(a[0]>=a[1])
{
if(a[0]>a[2])
m='C';
else
m='B';
}
else if(a[0]<a[1])
{
if(a[1]>a[2])
m='J';
else
m='B';
}*/
return c[k];
}
int main()
{
int N;
// while((scanf("%d",&N))!=EOF)
// {
// int c1=0,c2=0;
// int lena=strlen(a),lenb=strlen(b);
scanf("%d",&N);
char a,b;
int c1,c2,c3;//只需要记录一个人的数据其实
c1=c2=c3=0;
int j[3],y[3]; //记录是用什么字母赢得,用int而不是char,因为我记得是个数
fill(j,j+3,0);
fill(y,y+3,0);
int N1=N;
getchar(); //这个换行重点
while(N1--)
{
// scanf("%c %c",&a,&b); //会认为空格是输入
a=getchar();
//scanf("%c", &a);
getchar(); //吸收空格
b=getchar(); //getchar用法
//scanf("%c", &b);
getchar(); //吸收换行
switch(a) //CJB写成了CJK
{
case 'C':
switch(b)
{
case 'C' :c2++;break;
case 'J' :c1++;j[1]++;break;
case 'B' :c3++;y[0]++;break;
}
break; //这里还有break
case 'J':
switch(b)
{
case 'C' :c3++;y[1]++;break;
case 'J' :c2++;break;
case 'B' :c1++;j[2]++;break;
}
break;
case 'B':
switch(b)
{
case 'C' :c1++;j[0]++;break;
case 'J' :c3++;y[2]++;break;
case 'B' :c2++;break;
}
break; //别忘记这个break
}
}
char ma=compare(j),mb=compare(y);
printf("%d %d %d\n%d %d %d\n%c %c\n",c1,c2,N-c1-c2,c3,c2,N-c3-c2,ma,mb);
//}
return 0;
}