刷题笔记day1

7-1 最大子列和问题

在线扫描算法

#include<stdio.h>
int main()
{
    int k;
    scanf("%d",&k);
    int a[100005];
    int thissum=0;
    int maxsum=0;
    for(int i=0;i<k;i++)
    {
        scanf("%d",&a[i]);
        thissum += a[i];
        if(thissum >  maxsum)
            maxsum = thissum;
        if(thissum < 0)
            thissum = 0;
     }
     printf("%d\n",maxsum);
}

7-2 一元多项式的乘法与加法运算 

此题可用hash映射的思路,原因在于此题的指数均大于等于0.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct node
{
    int xi;
    int zhi;
};
struct node a[1005];
struct node b[1005];

int jia[1005];
int cheng[2500];

int main()
{
    int m,n;

    memset(jia,0,sizeof(jia));
    memset(cheng,0,sizeof(cheng));

    scanf("%d",&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&a[i].xi,&a[i].zhi);
        jia[a[i].zhi] += a[i].xi;
    }
    scanf("%d",&n);
    for(int j=0;j<n;j++)
    {
        scanf("%d%d",&b[j].xi,&b[j].zhi);
        jia[b[j].zhi] += b[j].xi;
    }

    for(int ii=0;ii<m;ii++)
    {
        for(int jj=0;jj<n;jj++)
        {
            cheng[a[ii].zhi+b[jj].zhi] += a[ii].xi*b[jj].xi;
        }
    }
    
    int ans1=0;
    int ans2=0;
    
    for(int q=2499;q>=0;q--)
    {
        if(cheng[q]!=0)
        {
            if(ans1==1)
                printf(" ");
            ans1=1;
            printf("%d %d",cheng[q],q);
        }
    }
    if(ans1==0)printf("0 0");

    printf("\n");

    for(int k=1004;k>=0;k--)
    {
        if(jia[k]!=0)
        {
            if(ans2==1)
                printf(" ");
            ans2=1;
            printf("%d %d",jia[k],k);
        }
    }
    
    if(ans2==0) printf("0 0");
    printf("\n");



}

6-1 单链表逆转  (要复习)

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */

List Reverse( List L );

int main()
{
    List L1, L2;
    L1 = Read();
    L2 = Reverse(L1);
    Print(L1);
    Print(L2);
    return 0;
}

List Reverse( List L )
{
    List head = L;
    L = NULL;
    List q;
    while(head)
    {
        q = head;
        head = head->Next;
        q->Next = L;
        L = q;
    }
    return L;
}

【PAT A1059】Prime Factors

只能进行质因子在2000之内的质数分解。可以修改pnum的最大值,以进行更大的质数的分解的实现。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int p=0;
int pnum[2000];
int isp[2000]={0};

void prime()//生成素数数组
{
    for(int i=2;i<2000;i++)
    {
        if(isp[i]==0)
        {
            pnum[p++]=i;
            for(int j=i+i;j<2000;j+=i)
                isp[j]=1;
        }
    }
}
struct factor
{
    int x;//质因子
    int cnt;//次数
}fac[10];

int main()
{
    prime();
    
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        
        int temp = n;

        if(n==1) 
        {
            printf("1=1\n");
            continue;
        }
        
        int f=0;
        while(n!=1)
        {
            for(int i=0;i<p;i++)
            {
                int ccount=0;
                while(n%pnum[i]==0)
                {
                    ccount++;
                    n /= pnum[i];
                }

                if(ccount>0)
                {
                    fac[f].x = pnum[i];
                    fac[f].cnt = ccount;
                    f++;
                }

            }
        }
        
        printf("%d=",temp);

        for(int j=0;j<f;j++)
        {
            if(fac[j].cnt==1)
                printf("%d",fac[j].x);
            else
                printf("%d^%d",fac[j].x,fac[j].cnt);
            if(j!=f-1)
                printf("*");
        }

        printf("\n");
    }
}

codeup 5.6.2  高精度加减法

#include<stdio.h>
#include<string.h>
struct bign
{
    int d[1000];
    int len;
    bign()
    {
        memset(d,0,sizeof(d));
        len=0;
    }
};

int compare(bign a, bign b)//比较大小
{
    if(a.len>b.len) return 1; //a大
    else if(a.len<b.len) return -1;//b大
    else
    {
        for(int i=a.len-1;i>=0;i--)
        {
            if(a.d[i]>b.d[i]) return 1;
            else if(a.d[i]<b.d[i]) return -1;
        }
        return 0;
    }
}

//高精度加法
bign add(bign a,bign b)
{
    bign c;
    int carry = 0;
    for(int i=0;i<a.len||i<b.len,i++)
    {
        int temp = carry+a[i]+b[i];
        c.d[c.len++] = temp % 10;
        carry = temp / 10;
    }
    if(carry != 0)
    {
        c.d[c.len++] = carry;
    }
    return c;
}

//高精度减法a-b
bign sub(bign a,bign b)
{
    bign c;
    int carry = 0;
    for(int i=0;i<a.len;i++)
    {
        if(a.d[i] < b.d[i])
        {
            a.d[i + 1]--;
            a.d[i] += 10;
        }
        c.d[c.len++] = a.d[i] - b.d[i];
        while(c.len-1 > =1 && c.d[c.len - 1]==0)
        {
            c.len--;
        }
    }
    return c;
}

猜你喜欢

转载自www.cnblogs.com/yoyoyayababy/p/12380633.html