参考ppt
原来是特殊情况
除以0与没考虑-1
大数加法
#include<bits/stdc++.h>
using namespace std;
char ch[2000];
char ch2[2000];
int num[2000];
int a[2000];
int b[2000];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",ch);
scanf("%s",ch2);
int l =strlen(ch);
int l2 =strlen(ch2);
memset(a,0,sizeof(a));
for(int i=1; i<=l; i++)
{
a[i]=ch[l-i]-'0';
}
memset(b,0,sizeof(b));
for(int i=1; i<=l2; i++)
{
b[i]=ch2[l2-i]-'0';
}
memset(num,0,sizeof(num));
int len =max(l,l2);
for(int i=1; i<=len; i++)
{
num[i]=num[i]+a[i]+b[i];
if(num[i]>=10)
num[i+1]=num[i]/10;
num[i]=num[i]%10;
}
if(num[len+1])
len++;
for(int i=len; i>=1; i--)
{
printf("%d",num[i]);
}
printf("\n");
}
return 0;
}
大数减法
#include<bits/stdc++.h>
using namespace std;
struct node
{
int num[2000];
int len;
} a,b,x;
char ch[2000];
char ch2[2000];
int check()
{
if(a.len>b.len)
{
return 0;
}
else if(a.len<b.len)
{
return 1;
}
else
{
for(int i=a.len; i>=1; i--)
{
if(a.num[i]>b.num[i])
return 0;
if(a.num[i]<b.num[i])
{
return 1;
}
}
return 2;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
bool f=0;
scanf("%s",ch);
scanf("%s",ch2);
int l =strlen(ch);
int l2 =strlen(ch2);
memset(a.num,0,sizeof(a.num));
a.len=l;
b.len=l2;
for(int i=1; i<=l; i++)
{
a.num[i]=ch[l-i]-'0';
}
memset(b.num,0,sizeof(b.num));
for(int i=1; i<=l2; i++)
{
b.num[i]=ch2[l2-i]-'0';
}
memset(x.num,0,sizeof(x.num));
if(check()==1)
{
swap(a,b);
f=1;
}
if(check()==2)
{
printf("0\n");
}
else
{
int le =max(l,l2);
int lesum=0;
for(int i=1; i<=le; i++)
{
// cout<<a.num[i]<<" "<<b.num[i]<<endl;
x.num[i]=x.num[i]+a.num[i]-b.num[i];
if(x.num[i]<0)
{
x.num[i+1]--;
x.num[i]=10+x.num[i];
}
}
int sub=le;
while(x.num[sub]==0)
{
le--;
sub--;
}
if(f==1)
{
printf("-");
}
for(int i=le; i>=1; i--)
{
printf("%d",x.num[i]);
}
printf("\n");
}
}
return 0;
}
大数乘法(乘小数)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char ch[2000];
int num[2000];
int a[2000];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll b;
memset(ch,' ',sizeof(ch));
scanf("%s",ch);
scanf("%lld",&b);
// cout<<ch<<endl;
// cout<<b<<endl;
int l =strlen(ch);
memset(a,0,sizeof(a));
for(int i=1; i<=l; i++)
{
a[i]=ch[l-i]-'0';
}
memset(num,0,sizeof(num));
int len =l;
// cout<<a[1]<<endl;
for(int i=1; i<=len; i++)
{
num[i]=num[i]+a[i]*b;
if(num[i]>=10)
num[i+1]+=num[i]/10;
// cout<<num[i]<<endl;
num[i]=num[i]%10;
}
if(num[len+1])
len++;
for(int i=len; i>=1; i--)
{
printf("%d",num[i]);
}
printf("\n");
}
return 0;
}
大数除法(除小数)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char ch[2000];
int num[2000];
int a[2000];
int mod[2000];
int sub[2000];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll b;
memset(ch,' ',sizeof(ch));
scanf("%s",ch);
scanf("%lld",&b);
int l =strlen(ch);
memset(a,0,sizeof(a));
for(int i=1; i<=l; i++)
{
a[i]=ch[l-i]-'0';
}
memset(num,0,sizeof(num));
memset(mod,0,sizeof(mod));
memset(sub,0,sizeof(sub));
int len =l;
for(int i=len; i>=1; i--)
{
sub[i]+=a[i];
num[i]= sub[i]/b;
int m =sub[i]%b;
sub[i-1]+=m*10;
mod[i]= m;
}
int numlen=len;
while(num[numlen]==0)
{
if(numlen==1)
{
break;
}
numlen--;
}
for(int i=numlen; i>=1; i--)
{
printf("%d",num[i]);
}
printf("\n");
printf("%d\n",mod[1]);
// cout<<mod[1]<<endl;
}
return 0;
}
二分系列(H题,I题,K题)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,q;
scanf("%d%d",&n,&q);
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
}
sort(a+1,a+1+n);
while(q--)
{
bool f1=0,f2=0;
ll l,r;
scanf("%lld%lld",&l,&r);
int l1,r1;
l1=1,r1=n;
int ans=0;
while(l1<=r1)
{
int mid =l1+r1>>1;
if(a[mid]>=l)
{
ans=mid;
f1=1;
r1=mid-1;
}
else
{
l1=mid+1;
}
}
int l2,r2;
l2=1,r2=n;
int ans2=0;
while(l2<=r2)
{
int mid =l2+r2>>1;
if(a[mid]<=r)
{
ans2=mid;
f2=1;
l2=mid+1;
}
else
{
r2=mid-1;
}
}
if(f1&&f2)
printf("%d\n",ans2-ans+1);
else
printf("0\n");
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn =1e5+9;
int a[maxn];
int h[maxn],w[maxn];
int n,k,x;
bool check(int mid)
{
int num=0;
for(int i=1; i<=n; i++)
{
num+=(h[i]/mid)*(w[i]/mid);
}
if(num>=k)
return true;
else
return false;
}
int bi()
{
int l=1,r=2*x;
int ans=0;
int mid;
while(l<=r)
{
mid=l+r>>1;
if(check(mid))
{
ans=mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
x=0;
int temp;
for(int i=1; i<=n; i++)
{
scanf("%d%d",&h[i],&w[i]);
temp =max(h[i],w[i]);
x =max(x,temp);
}
int len =bi();
printf("%d\n",len);
}
return 0;
}
M题
WA原因
- a[i]是int 类型a[i] * a[i] 是long long类型会炸
- 减法取余:(ans[r][k]+k-ans[l-1][k])%k)