十六进制高精度
#include<iostream>
using namespace std;
int main()
{
string s1,s2;
cin>>s1>>s2;
char a[2000],b[2000];
int c[4000]={0};
int t=s1.size();
int k=s2.size();
//输入转化为数字
for(int i=0;i<t;i++)
{
if(s1[i]>='0'&&s1[i]<='9')
a[t-i]=s1[i]-'0';
else
a[t-i]=s1[i]-'A'+10;
}
for(int i=0;i<k;i++)
{
if(s2[i]>='0'&&s2[i]<='9')
b[k-i]=s2[i]-'0';
else
b[k-i]=s2[i]-'A'+10;
}
int m=k+t-1;
int x=0;
for(int i=1;i<=k;i++)
{
for(int j=1;j<=t;j++)
{
c[i+j-1]=c[i+j-1]+b[i]*a[j]+x;
x=c[i+j-1]/16;
c[i+j-1]%=16;
}
if(x>0)
{
c[i+t]+=x;
x=0;
}//每一位完成之后都要进位
}
if(c[k+t]>0)
m++;
//输出转换为十六进制
for(int i=m;i>0;i--)
{
if(c[i]>=10)
{
char p='A'+c[i]-10;
cout<<p;
}
else
cout<<c[i];
}
cout<<endl;
return 0;
}
一元三次方程
- 可直接根据求根公式求出单调区间;
- 可以找到每个零点所在区间的两个端点
- 直接三次二分法【判断:函数值】
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
const double eps=0.0000000001;
double a,b,c,d,p,q;
//函数值
double f(double x)
{
return a*x*x*x+b*x*x+c*x+d;
}
//二分法
double search(double l,double r)
{
while(r-l>=eps)
{
double mid=(l+r)/2;
if(f(l)==0) return l;
if(f(mid)==0)return mid;
if(f(r)==0) return r;
if(f(l)*f(mid)>0)
l=mid;
else
r=mid;
}
return l;
}
int main()
{
int n;
cin>>n;
for(int i=n;i>=1;i--)
{
scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&p,&q);
//3axx+2bx+c
double x1=(-2*b-sqrt(4*b*b-12*a*c))/(6*a);
double x2=(-2*b+sqrt(4*b*b-12*a*c))/(6*a);
//细节:x1&x2的大小关系是不确定的
if(x1>x2)
{
swap(x1,x2);
}
cout.setf(ios::fixed,ios::floatfield);
cout<<setprecision(9)<<search(p,x1)<<" ";
cout<<setprecision(9)<<search(x1,x2)<<" ";
cout<<setprecision(9)<<search(x2,q)<<endl;
}
return 0;
}
REVERSING LINKED LIST
- stack+数组
- stack做比较麻烦,细节问题比较多->可以实现反转 ->
- 每一次翻转的最后一个的next应该是当前栈顶的地址
- 最后一次翻转的结尾要补充【栈为空应输出-1,非空为栈顶的地址】
#include<iostream>
#include<stack>
using namespace std;
struct node{
int ad,da,next;
}u[100000],x;
int main()
{
int start,n,k;
cin>>start>>n>>k;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
cin>>u[a].da>>u[a].next;
u[a].ad=a;
}
int m=0;
stack <node>q;
int flag=0;
int j=0;
for(int i=start;i!=-1;i=u[i].next)
{
int nx,ny;
m++;
q.push(u[i]);//入栈
if(m%k==0)
{
flag++;
if(flag==1) start=i;
else printf("%05d\n",q.top().ad);
//翻转的结尾
while(!q.empty())
{
nx=q.top().ad;
ny=q.top().da;
q.pop();
if(!q.empty())
{
printf("%05d %d ",nx,ny);
if(q.top().ad!=-1)
printf("%05d\n",q.top().ad);
else
cout<<"-1"<<endl;
}//翻转
}
printf("%05d %d ",nx,ny);
j=i;
}
}
//补充末端
if(q.empty())
cout<<"-1";
else
printf("%05d\n",u[j].next);
for(int i=u[j].next;i!=-1;i=u[i].next)
{
if(u[i].next!=-1)
printf("%05d %d %05d\n",u[i].ad,u[i].da,u[i].next);
else
printf("%05d %d -1\n",u[i].ad,u[i].da);
}
return 0;
}