2021 11月23日学习总结

事务

  1. 上午对大数重新进行了一次编写。
  2. 对于启航第一次上机的机试《求力量》进行了一次理解。
  3. 尝试去理解动态规划(失败告终)
  4. 晚上上机做了一下菜鸟杯题目/
  5. 晚上写启航字符串题目目前只做了前面2题;

 总结:革命还未成功,我还需努力

评价:B-;

改进方案:合理安排好时间,因为自身任务多,更需要找时间,准备算法。

学习成功展示:

大数加法

(在通常情况下,是会用long long int 表示 。但是一旦溢出范围,计算机就会通过原反补进行存放,结果就会事与愿违。这时候就需要大数加法来帮忙了!!)

 

#include<stdio.h>
char a[10000],b[1000000];
int n1[100000],n2[1000000];
main()
{
    gets(a);
    gets(b);
    int n,m;
    n=strlen(a);//strlen( )测试字符串长度,比如“abc”则返回为3
    m=strlen(b);
    int i,x;
    for(i=n-1,x=0;i>=0;i--,x++)
        n1[x]=a[i]-48;//不会不会不会吧会有人不知道'0'的ascii为48吧;
         for(i=m-1,x=0;i>=0;i--,x++)
        n2[x]=b[i]-48;
        int max;
        if(n>m)
            max=n;
        else max=m;
        for( i=0;i<=max+5;i++)
       {

             n1[i]=n1[i]+n2[i];
             if(n1[i]>=10)//进位,如果大于十就进位
             {
                 n1[i]=n1[i]-10;
                 n1[i+1]++;//进位
             }
        }
        for(i=max+5;i>=0&&n1[i]==0;i--);/*因为我的n1是预定义,默认里面都是0,先把无意义的0补输出*/
         if(i<0)//考虑0加0的情况
           printf("0\n");
          else
        for( ;i>=0;i--)//这时候i是最高位的下标
            printf("%d",n1[i]);



}

大数减法

温馨小贴士:减法与加法相似,但是要考虑负数情况。有的人可以因为这个可以写好长好长的代码,使人望而生畏。我的是50行左右,但是并不是最简洁的,但是一定保证你可以理解

#include<stdio.h>
#include<string.h>
char a[10000];
char b[10000];
int num1[10000];
int num2[10000];
char t[10000];
main()

{
    int f=0;
   gets(a);
   gets(b);
   int n,m;
   n=strlen(a);
   m= strlen(b);
   if(m>n||(m==n&&strcmp(a,b)<0))//我永远只拿最大的数相比比如说12,123就符合我的条件,或者说//123,135也符合条件
   {  strcpy(t,a);//进行交换
        strcpy(a,b);
        strcpy(b,t);
        f=1;//这是符号判断,f为1即是负数
        n=strlen(a),
        m=strlen(b);
       }
       int max=n;
       if(max<m)
         max=m;
       int i,j;
       for(i=n-1,j=0;i>=0;i--,j++)
        num1[j]=a[i]-'0';//逆序存放
         for(i=m-1,j=0;i>=0;i--,j++)
        num2[j]=b[i]-'0';
        for(i=0;i<=max;i++)
            if(num1[i]>=num2[i])//考虑num[i]==num2[i] 我就在这错了好久/
               num1[i]-=num2[i];
           else
           {
               num1[i]=num1[i]+10-num2[i];//借位
               num1[i+1]--;//上一个位减1
           }
           for(i=max+5;i>=0&&num1[i]==0;i--);//省略无意义的零;
           if(f)
            printf("-");//负数,输出
            if(num1[0]==0&&i<0)//考虑0-0
            printf("0");
            else
           for( ;i>=0;i--)
            printf("%d",num1[i]);//输出
}

大数相乘

其实相乘,并不难,但是前提必须发现一个规律sum[i+j]=sum[i+j]+a[i]*b[j];

#include<stdio.h>
#include<string.h>
 char a[1000],b[1000];
 int num1[1000],num2[1000],num[100000];
main()
{
    int n,m,x,i,j;
   gets(a);
   gets(b);
   n=strlen(a);
   m=strlen(b);
   for(int i=n-1,x=0;i>=0;i--,x++)
     num1[x]=a[i]-48;
   for(i=m-1,x=0;i>=0;i--,x++)
     num2[x]=b[i]-48;
     int max;
     if(n>m)
        max=n;
     else
        max=m;
     for(i=0;i<n;i++)
           for(j=0;j<m;j++)
               num[i+j]=num1[i]*num2[j]+num[i+j];//一定不要忘记加num[i+j]我第一次打,找了好久,我先一次性算完
     for(i=0;i<max*2;i++)
     {
         num[i+1]=num[i+1]+num[i]/10;//后面进行处理
         num[i]=num[i]%10;
     }
     for(i=max*2;i>=0&&num[i]==0;i--);
     if(i<0)
        printf("0\n");
     else
     for( ;i>=0;i--)
        printf("%d",num[i]);
}

大数阶乘

#include<stdio.h>
int a[100000];
main()
{
    int n,j,i;
    scanf("%d",&n);
    int len=1;
    a[0]=1;
    for(i=2;i<=n;i++)
       {
            for(j=0;j<len;j++)
           a[j]=a[j]*i;
           for(j=0;j<len;j++)
           {
               if(a[j]>=10)
               {
                   a[j+1]=a[j]/10+a[j+1];
                   a[j]=a[j]%10;
               }
               if(a[len]>0)
                  len++;
           }
       }
       for(i=len+5;a[i]==0&&i>=0;i--);
       for( ;i>=0;i--)
        printf("%d",a[i]);


}

启航当时的计算机题目

https://oj-sail.piplong.cn/contest/20/problem/5

就是这种题目,注意范围。

推箱子

https://oj-sail.piplong.cn/contest/20/problem/12

http://jsuacm.cn/contest.php?cid=1646

都是一模一样的题目。好后悔当时没有去做jsuacm这道题目,呜呜呜

所以现在补上

#include<stdio.h>
int b[100000];
int a[100000];
main()
{
    int v;
    scanf("%d",&v);
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(int i=0;i<n;i++)
         for(int j=v;j>=a[i];j--)
         if(b[j]>b[j-a[i]]+a[i])
             ;
    else
          b[j]=b[j-a[i]]+a[i];
    printf("%d",v-b[v]);
}

我也不是很懂,但是我把代码,背出来了,用了贪心,有点动态规划的感觉。

一点小杂碎(我困了,有思路,不想做,怕我忘记才打了思路)

http://jsuacm.cn/problem.php?cid=1656&pid=1

这个题目

 列举数量

1 3 7 12 18 25
即你会发现,除了n>=2不可以套公式,其他都可以套。

第3个开始为第二层的数量n+1  即是3+3+1=7

第4个                                           即是7+5=12;

即是公式为

a[i]=a[i-1]+n+1;

因为时间有限,所以没有去敲。

吉首大学

本来不想说了,但是怕明天自己起床忘记,试一下。

这里用到了贪心(贪心好恶心,呜呜呜)

我们可以分断,以案例为例子

00001

第一次分 无  00001 时间为4s

第二次   0     0001   时间为3s

第三次  00     001    时间为2s

第四次  000    0 1   时间为1s

第五次  0000   1     时间0s

第五次  00001   无  时间1s

所以是0s

但是我们怎么让程序实现呢?这才是一个大问题是吧

我们可以用

min time=min(min time,num-x+y)

这是核心语句

解释:

min time :存放最短的时间

min(_):用户自定义函数,判断最小值

num:我用来统计这个里面有多少零。

x:表示分段前面的0;

y:表示分段前面的1

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值