第一次周赛

十六进制高精度

  • 留意直接用十六进制进行转换:无需变化为十进制
#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值