3.12学习(2020)

longlong类型
long long的最大值:9223372036854775807 long long的最小值:-9223372036854775808 输入输出:
%lld** vc环境中只能用***__int64***,输入输出用***%I64d***。

memset(a,‘0’,sizeof(a)) memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。 这条语句是把a中所有字节换做字符“0”,常用来对指针或字符串的初始化。

  • 字符‘0’对应的ASCII码是48,48对应的十六进制数就是0x30,通常我们在编程的时候,用字符转化为数字的时候经常要用到,比如要将‘8’转换为数字8,在语句中这样写就可以了,“ 8+‘0’”。这里的8就是数字。

高精度加法的模板题

输入的第一行包含一个整数T(1 <= T <= 20),它表示测试用例的数量。然后是T行,每行由两个正整数A和B组成。请注意,这些整数非常大,这意味着您不应使用32位整数对其进行处理。您可以假设每个整数的长度不超过1000。

样本输入
2
1 2
112233445566778899 998877665544332211

样本输出
情况1:
1 + 2 = 3
情况2:
112233445566778899 + 998877665544332211 = 1111111111111111110

由于数字过大,1000位,long long都不可能存的下2 ^ 64 100位都没有吧?
因此只能用字符串读入,然后存入副本。通过模拟加法运算,进位,最后得到数组C,用循环输出即可。

为了方便进位,因此要把数字倒过来,即个位放在一块的0位(或者1位)上。

#include <stdio.h>
#include <string.h>
int max(int a,int b);
int main(){
	int lena,lenb,num,t,i,n,j,lenc;
int a[1020],b[1020],c[1020];
char s1[1020],s2[1020];
    scanf("%d",&n);
    for(i = 1;i <= n; ++i){
        scanf("%s%s",s1,s2); 
        lena = strlen(s1); lenb=strlen(s2);
        memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); num=0;
        memset(c,0,sizeof(c));
        lenc = max(lena,lenb);
        for(j = 0; j <= lena - 1; ++j){a[lena - j - 1] = s1[j] - '0';}
        for(j = 0; j <= lenb - 1; ++j){b[lenb - j - 1] = s2[j] - '0';}

        for(j = 0; j <= lenc; ++j){
            c[j] = a[j] + b[j] + num; num=0;
                if(c[j] >= 10){
                    c[j] -= 10; num = 1;
                }
            }
        if(c[lenc] == 0){ --lenc;} //如果最高位没有发生进位,那么答案长度减一
        //非第一个样例输出一个换行,保证格式,不然会PE
        i == 1 ? printf("Case %d:\n%s + %s = ",i,s1,s2) : printf("\nCase %d:\n%s + %s = ",i,s1,s2);

        for(j = lenc;j >= 0; --j) {printf("%d",c[j]);} //输出答案
        printf("\n");
    }
    return 0;
}
int max(int a,int b)
{
return a>b?a:b;
}

原文链接
添加链接描述

**

最大总和

**问题描述
给定序列a [1],a [2],a [3] … a [n],您的工作是计算子序列的最大和。例如,给定(6,-1,5,4,-7),此序列中的最大和为6 +(-1)+ 5 + 4 = 14。

#include <stdio.h>
#include<string.h>
#define N 100010

int main()
{
    int dp[N];
    int t;
    scanf("%d",&t);
    for(int cas = 1; cas <= t; cas++)
    {
        memset(dp,0,sizeof(dp));
        int n, temp = 1,st = 1, en = 1; int  thisSum = 0, maxSum = -1001;
        scanf("%d",&n);
        for(int i = 1; i <= n; i++)
        scanf("%d",&dp[i]);
        for(int j = 1; j <= n; j++)
        {
            thisSum += dp[j];
            if(thisSum>maxSum)
            {
                st = temp;
                en = j;
                maxSum = thisSum;
            }
            if(thisSum<0)
            {
                thisSum = 0;
                temp = j+1;
            }
        }
        printf("Case %d:\n%d %d %d\n",cas,maxSum,st,en);
        if(cas<t)
        printf("\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值