Misaka博客的开始&&模拟与高精度(week 1)

发布于 2022-10-29  2178 次阅读


因为大家都在卷自己的个人博客

所以在测完核酸后做出了也临时做一个网站的决定。

于是找到了对这方面比较懂的初中同学。

向大佬借了个:

子域名x1

虚拟主机x1

还让佬在我睡觉的时候把WordPress给部署好了

tql。

哭啊QAQ。

总而言之。

捏这个博客就是弄好了吧,虽然可以互动的地方非常有限(不如说基本没有?),页面的观感也非常差。

空空如也的导航栏
大量的空白

比不上用好几天时间研究的其他同学,比不上从源码敲起的虚叶前辈,更比不上耐心的初中同学,但是总归是自己写 给自己看的,也就不苛求精致的GUI了(让进来审查的老前辈不吐出来就是胜利)。以后也会在这里上传自己的学习进度,好好梳理一周的学习内容,得步而进步。


week1 周作业 模拟与高精度。

T1 乒乓球(模拟题)

没什么要注意的,坑点在比赛结束的条件:
双方比分差要 大于等于 2

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	char a; char b[100005];
	int win=0,lose=0,i=0;
	while(cin>>a&&a!='E'){
		i++; b[i]=a;
		}
		for(int k=1;k<=i;k++){
			if(b[k]=='W') win++;
		else lose++;
		if((win>=11||lose>=11)&&abs(win-lose)>=2){
			cout<<win<<":"<<lose<<endl;
			win=0,lose=0;
		}
	}
	cout<<win<<":"<<lose<<endl<<endl;
	win=0,lose=0;
	for(int k=1;k<=i;k++){
		if(b[k]=='W') win++;
		else lose++;
		if((win>=21||lose>=21)&&abs(win-lose)>=2){
			cout<<win<<":"<<lose<<endl;
			win=0,lose=0;
		}
	}
	cout<<win<<":"<<lose<<endl;

	return 0;
}

可是为什么不写函数呢。)


T2 高精度A+B(高精度加法)

lds学长说高精度是非常基础的内容,于是我也就简单模拟了一下,并没有学习到这道题的精髓。
坑点:

① 以 char类型 存储的数字转化为 int类型 进行计算的时候要减去0的ascii码的值。
(char)number = (int)(number-'0');

② 要比较两个数的长度,在较短数前面不断加0直到两数长度相等后才可以模拟竖式相加。

下为过此题的代码,仅仅为了 解出这道题写的。

//高精度加法。
#include <bits/stdc++.h>
using namespace std;
int carry;
int str_add(char a,char b){
	 int _new = a+b-'0'-'0';
	 _new+=carry; carry = 0;
	 if(_new>9){
	 	_new%=10;
	 	carry++;
	 }
	 return _new+'0';//该return什么啊(恼。
}
int main(){
	string a,b;
	cin>>a>>b;
	int l1=a.length(),l2=b.length();
	int length=l1;
	if(l1<l2){
		length = l2;
		for(int i=l1;i<l2;i++)
		a="0"+a;
	}
	else if(l1>l2){
		length = l1;
		for(int i=l2;i<l1;i++)
		b="0"+b;
	}
	
	for(int i=length-1;i>=0;i--){
		b[i] = str_add(a[i],b[i]);
	}
	if(carry!=0){
		cout<<"1";
	}
	for(int i=0;i<length;i++)
	cout<<b[i];
	return 0;
}

T3 高精度累加。(高精度乘法)

题目是给小于100位的整数n,求1+2+...+n的值。
也就是求(n+1)n/2 的值。
也就是要求模拟高精度乘法。

注意的是当位数为0的时候就可以直接不用计算这位数了。
然后模拟竖式乘法计算。
仍然只是为了做出这道题所以在输出的时候进行判断完成除2的操作。
非常愚蠢。)

#include <iostream>
#include <string>
using namespace std;

//加法操作。
string add_str(string a,string b){
	string str="";
	int len1 = a.length();
	int len2 = b.length();
	if(len1>len2){
		for(int i = 1;i<=len1-len2;i++)
		b="0"+b;
	}
	else{
		for(int i=1;i<=len2-len1;i++)
		a="0"+a;
	}
	len1=a.length();
	int temp;
	int carry = 0;
	for(int i=len1-1;i>=0;i--){
		temp = a[i]-'0'+b[i]-'0'+carry;
		carry = temp/10;
		temp%=10;
		str=(char)(temp+'0')+str;
	}
	if(carry!=0) str=(char)(carry+'0')+str;
	return str;
}

//乘法操作。(其中模拟了a每一位数与b相乘的结果并用了加法累加)
string mul_str(string a,string b){
	string ans_str;
	int len1=a.length();
	int len2=b.length();
	string tempstr;
	for(int i = len1-1;i>=0;i--){
		tempstr="";
		int multi=a[i]-'0';
		int carry = 0,temp=0;
		if(multi!=0){
			for(int k=1;k<=len1-1-i;k++){
				tempstr+="0";
			}
			for(int l=len2-1;l>=0;l--){
				temp = (multi*(b[l]-'0')+carry);
				carry = temp/10;
				temp %= 10;
				tempstr = (char)(temp+'0')+tempstr;
			}
			if(carry!=0) tempstr = (char)(carry+'0')+tempstr;
		}
		ans_str=add_str(ans_str,tempstr);
	}
	return ans_str;
}

int main(){
	string a;
	cin>>a;
	a = mul_str(a,add_str(a,"1"));
	int len = a.length();
	int carry=0;
	for(int i=0;i<len;i++){
		if(i==0&&a[i]-'0'==1){
			carry = 1;
			continue;
		}
		cout<<(carry*10+(a[i]-'0'))/2;
		carry = (carry*10+(a[i]-'0'))%2;
	}
	return 0;
}

嗯,非常愚蠢。)


存在的问题:

①高精度除法还没试着写过TAT。
②经常会投机取巧 最后搬石砸脚。

再次谢谢(送)给我博客一隅的大佬了XwX
下为dalao个人页。)

白のblog – 向往技术力の彼方 (mashiro.pro)