写在前面
本来我是想给这个周报起一个比较霸气侧漏有文采的名字,但是在奈何肚子里墨水不多,只能像现在这样了。
都干了什么
咋说嘞,这周主要任务就是敲洛谷上面的题,其他的好像真的都还是副业(了解一下前端知识啦,还顺手研究了一天开发板也仅是新手入门的arduino)。
了解前端的话也仅仅是了解初步学习,至少等将来分方向的时候也就有了一些认识,不至于盲目选择。
这次周报的主要内容有
1.对洛谷有些题的分析见解。
2一小丢丢对前端学习的理解。
3.下周计划
1.对洛谷有些题的理解
这周也是兴不辱命,敲完了所布置的洛谷,不过今天下午(11.28)洛谷崩了,有几个题交不上去,无法验证对错,先姑且不论,给的范例测试对了,但不知道具体结果怎么样。
先来谈一下让我当时卡了那么长时间的p1009,也就是阶乘之和,起初做的时候,就不知道嘛叫高精度,结果这一报错才明白了这是超范围了。我大意了,看了一下题解,说是有大数相乘和大数相加的思想,为此我还专门跑去学了一下这两个知识点,废话少说,上代码。
先是大数相乘
#include <stdio.h>
#include <string.h>
int main()
{
char a1[10000],b1[10000];
int a[100000]={0},b[100000]={0},k[100000]={0};
int i,j,len1,len2,now=0,temp,next;
scanf("%s %s",a1,b1);
len1=strlen(a1);
len2=strlen(b1);
for(i=len1-1;i>=0;i--)
{
a[now]=(a1[i]-'0');
now++;
}
//把数字的低位放在数组的前面,便于后面运算
now=0;
for(i=len2-1;i>=0;i--)
{
b[now]=(b1[i]-'0');
now++;
}
//前面的就是把两个输入的用字符串表示的数字变成一个用数组表示的数字
for(i=0;i<len1;i++)
{
for(j=0;j<len2;j++)
{
temp=a[i]*b[j];
next=i+j;//表示该数应该放到那个位
k[next]+=temp%10;//这个位上应该是进上去剩下的数字
k[next+1]+=temp/10; //进位的多少
while(k[next]>=10)//检查后面需不需要进位
{
k[next+1]+=(k[next]/10);
k[next]=k[next]%10;
next++;
}
}
}
//这一块是实现大数相乘的核心,思考起来就会发现,这和咱们用手算乘法差不多,都是一个一个乘,一个一个进位。
now=len1+len2-1;//一般相乘的位数
if(a[len1-1]*b[len2-1]>=10)
{
now++;//计算最终有没有进位
}
while(k[now-1]==0&&now!=1)
{
now--;//跳到该输出数字的那一位
}
for(i=now-1;i>=0;i--)
{
printf("%d",k[i]);
}
return 0;
}
学了大数相乘,我就想是不是只需要少少改动一下大数相乘的代码便就是大数相加了,于是有了下面的代码。
#include <stdio.h>
#include <string.h>
int main()
{
char a1[10000],b1[10000];
int a[100000]={0},b[100000]={0},k[100000]={0};
int i,j,len1,len2,now=0,temp,next;
scanf("%s %s",a1,b1);
len1=strlen(a1);
len2=strlen(b1);
for(i=len1-1;i>=0;i--)
{
a[now]=(a1[i]-'0');
now++;
}
now=0;
for(i=len2-1;i>=0;i--)
{
b[now]=(b1[i]-'0');
now++;
}
if(len1>len2)
{
len2=len1;
}
for(i=0;i<len1;i++)
{
temp=a[i]+b[i];
//next=i+j;
k[i]+=temp%10;
k[i+1]+=temp/10;
if(k[i+1]>=10)
{
k[i+1]+=(k[next]/10);
k[next]=k[next]%10;
}
}
now=len1+len2;
while(k[now-1]==0&&now!=1)
{
now--;
}
for(i=now-1;i>=0;i--)
{
printf("%d",k[i]);
}
return 0;
}
是不是就差一点点。。
完了之后就信心满满去搞那个阶乘,,没想到,不会用这两个东西,在经过了长时间的思考和题解的帮助,灵光乍现
先是算阶乘
void cheng(int *a,int c)
{
int jw=0,i;
for(i=0;i<1000;i++)
{
a[i]=a[i]*c+jw;
jw=a[i]/10;
a[i]%=10;
}
}
然后是加法
void puls(int *a,int *c)
{
int jw=0,i;
for(i=0;i<1000;i++)
{
c[i]+=a[i]+jw;
jw=c[i]/10;
c[i]%=10;
}
}
最后把这个放进主函数就行了
#include <stdio.h>
int a[1001]={0};
int c[1001]={0};
void puls(int *a,int *c)
{
int jw=0,i;
for(i=0;i<1000;i++)
{
c[i]+=a[i]+jw;
jw=c[i]/10;
c[i]%=10;
}
}
void cheng(int *a,int c)
{
int jw=0,i;
for(i=0;i<1000;i++)
{
a[i]=a[i]*c+jw;
jw=a[i]/10;
a[i]%=10;
}
}
int main()
{
int sum=0,i,n,flag=0;
a[1]=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
cheng(a,i);
puls(a,c);
}
for(i=1000;i>0;i--)
{
if(c[i]!=0)
{
flag=1;
}
if(flag)
{
printf("%d",c[i]);
}
}
return 0;
}
除了这个题还有一个让我陷入超时循环中,,提交一次超时一次,
P1217 [USACO1.5]回文质数 Prime Palindromes
这个难道由于我不会创造回文数,就是会超时,搞人心态。
经过某位大佬的指出的三点。
1.100以内的回文质数只有11
2.偶数都不是质数。
3.位数是偶数位的数字没有质数。
这样一来问题便简单了起来,我只要写三个函数,先判读是不是偶数再判断是不是偶数位,在判断是不是回文数,再判断是不是素数,因为判断素数最浪费时间,所以放在最后。
位数判断
int wei(int number)
{
if(number==11)
{
return 1;
}
int cnt=0;
while(number>0)
{
number/=10;
cnt++;
}
if(cnt%2==0)
{
return 0;
}
else
{
return 1;
}
}
回文数判断
```int hui(int number)
{
int a[10],i=0,j;
while(number>0)
{
a[i]=number%10;
number/=10;
i++;
}
for(j=0;j<i;j++,i--)
{
if(a[i-1]!=a[j])
{
return 0;
}
}
return 1;
}
素数判断
int su(int number)
{
if(number==1)
{
return 0;
}
if(number==2)
{
return 1;
}
int i;
for(i=2;i<=sqrt(number);i++)
{
if(number%i==0)
{
return 0;
}
}
return 1;
}
到了最后主函数也就剩的不多了
int main()
{
int start,end;
scanf("%d %d",&start,&end);
for(;start<=end;start++)
{
if(start%2!=0&&wei(start)&&hui(start)&&su(start))
{
printf("%d\n",start);
}
}
return 0;
}
这样的话即使暴力遍历也不会出现超时的问题。
最后的话其实令我印象深刻的题很多就不一一举例了。
最后贴上洛谷做题记录
2.前端学习理解
前端的话也没有学下什么,刚开始就是学标签,背标签。
直接把记下的笔记放代码里面吧。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>????</title>
</head>
<body>
以下标签如无特殊注释都是双标签<br \>
<h2>标题标签1-6都可以</h2>
<p>《p》《\p》段落标签</p><br \>
《br \》换行标签强制换行,单标签,只是换行<br \>
<strong>《strong》语义强烈于《strong》</strong><b>语义强烈于 《b》</b><br \>
<em>《em》or 《i》倾斜</em><br \>
<del>《del》《s》删除线</del><br \>
<ins>《ins》或者《u》下划线</ins><br \>
《div》《span》<br \>
<h4>《ing》是单标签</h4>
<img src="123.png"/>
alt替换文本图像显示不出来就用文字替换<br \>
<img src="1234.png" alt="再见"/>
title 提示文本 鼠标放到图像上提示提示的文字<br \>
<img src="123.png" title="..."/>
《width》图像的宽度<br \>
<img src="123.png" width="500"/>
《height》图像的高度只修改一个就行<br \>
<img src="123.png" height="400"/>
《border》给图像设定边框<br \>
<img src="123.png" height="400" border="15"/>
</body>
</html>
也没有学习多少,就明白了前端是个啥,emmmm,没啥话了。
下周学习规划
下周的话准备搞一下下面几个东西
1.洛谷再刷一刷,学习啊哈算法。
2.学生管理系统能搞多少搞多少,50%左右吧。
3.前端再看一下,不准备深入学习,毕竟只是了解,过两周再学学后台是啥。
本周的周报就到此结束,欢迎下周再来观赏。