猫史档案馆


【C++】愚公移山模拟器(摘自B站)

用户:ENEMYENEMY查看:0 回复:0 评论:0 创建时间:2022-12-01T14:49:04


awa从B站复制的

链接:htt ps://www.luogu.com.cn/paste/9sagqugm

```cpp
#include<bits/stdc++.h>
#include <conio.h>
#include <windows.h>
using namespace std;
#define qp system("cls")
int pjn,fzn;
struct node {
	short len,a[10511];
	node() {
		len=0;
		memset(a,0,sizeof(a));
	}
	node(int x) {
		len=0;
		memset(a,0,sizeof(a));
		while(x!=0) {
			a[++len]=x%10;
			x/=10;
		}
	}
	void in() {
		memset(a,0,sizeof(a));
		len=0;
		char x[10501];
		scanf("%s",x+1);
		int p=strlen(x+1);
		for(int i=p; i>=1; i--) {
			a[++len]=x[i]-'0';
		}
	}
	node operator +(const node b)const {
		node c;
		c.len=max(len,b.len);
		for(int i=1; i<=c.len; i++) {
			c.a[i]+=a[i]+b.a[i];
			c.a[i+1]=c.a[i]/10;
			c.a[i]%=10;
		}
		if(c.a[c.len+1]>0)c.len++;
		return c;
	}
	node operator -(const node b)const {
		node c;
		if(len<b.len)return c;
		if(len==b.len) {
			for(int i=len; i>=1; i--) {
				if(a[i]>b.a[i])break;
				if(a[i]<b.a[i])return c;
			}
		}
		c.len=max(len,b.len);
		for(int i=1; i<=c.len; i++) {
			c.a[i]+=a[i]-b.a[i];
			if(c.a[i]<0) {
				c.a[i]+=10;
				c.a[i+1]--;
			}
		}
		while(c.a[c.len]==0)c.len--;
		return c;
	}
	node operator *(const node b)const {
		node c;
		c.len=len+b.len;
		for(int i=1; i<=len; i++) {
			for(int j=1; j<=b.len; j++) {
				c.a[i+j-1]+=a[i]*b.a[j];
				c.a[i+j]+=c.a[i+j-1]/10;
				c.a[i+j-1]%=10;
			}
		}
		while(c.a[c.len]==0)c.len--;
		return c;
	}
	void out() {
		if(len<=0)printf("0");
		for(int i=len; i>=1; i--) {
			printf("%d",a[i]);
		}
	}
} speed,V,fz,syg,nyg,nl[200];
char get() { //输入
	FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
	char c=getch();
	return c;
}
bool check(node aa) {
	for(int i=1; i<=aa.len; i++)if(aa.a[i]<0||aa.a[i]>9)return 1;
	return 0;
}
void iin() {
	qp;
	printf("请输入山的体积(立方千米)(<1.0*10^8):");
	V.in();
	while(V.len>8||check(V)) {
		printf("请勿输入非数字(负数)或山太大");
		Sleep(500);
		qp;
		printf("请输入山的体积(立方千米)(<1.0*10^8):");
		V.in();
	}
	printf("请输入一位愚公的挖掘速度(立方米/年)(0<x<100):");
	speed.in();
	while(speed.a[1]==0||speed.len>2||check(speed)) {
		printf("请勿输入非数字(负数)或速度太快或速度为0");
		Sleep(500);
		qp;
		printf("请输入山的体积(立方千米)(<1.0*10^8):");
		V.out();
		putchar('\n');
		printf("请输入一位愚公的挖掘速度(立方米/年)(0<x<100):");
		speed.in();
	}
	printf("请输入愚公的科技发展速度(立方米/五百年)(x<10):");
	fz.in();
	while(fz.len>1||check(fz)) {
		printf("请勿输入非数字(负数)或速度太快");
		Sleep(500);
		qp;
		printf("请输入山的体积(立方千米)(<1.0*10^8):");
		V.out();
		putchar('\n');
		printf("请输入一位愚公的挖掘速度(立方米/年)(0<x<100):");
		speed.out();
		putchar('\n');
		printf("请输入愚公的科技发展速度(立方米/五百年)(x<10):");
		fz.in();
	}
	printf("请输入愚公一次繁殖人数(当每次繁殖生下x个愚公)(1<x<10):");
	syg.in();
	while(syg.a[1]<2||syg.len>1||check(syg)) {
		printf("请勿输入非数字(负数)或人数太多或人数太少");
		Sleep(500);
		qp;
		printf("请输入山的体积(立方千米)(<1.0*10^8):");
		V.out();
		putchar('\n');
		printf("请输入一位愚公的挖掘速度(立方米/年)(0<x<100):");
		speed.out();
		putchar('\n');
		printf("请输入愚公的科技发展速度(立方米/五百年)(x<10):");
		fz.out();
		putchar('\n');
		printf("请输入愚公一次繁殖人数(每次繁殖生下x个愚公)(1<x<10):");
		syg.in();
	}
	printf("请输入每位愚公的平均年龄(0<x<150):");
	scanf("%d",&pjn);
	printf("请输入每位愚公的繁殖年龄(<平均年龄):");
	scanf("%d",&fzn);
	printf("\n按任意键开始移山......");
	get();
}
long long start() {
	qp;
	nyg=1,V=V*1000000000,nl[0]=1;
	long long 喵=1;
	while(1) {
		qp;
		printf("第%lld年:\n",喵);
		for(int i=pjn;i>=1;i--)nl[i]=nl[i-1];
		nl[0]=0;
		if(喵==170){
			喵++;
			喵--;
		}
		if(nl[fzn].len!=0) {
			nl[0]=nl[fzn]*syg,nyg=nyg+(nl[fzn]*syg);
			printf("喵);
			nl[fzn].out();
			printf("个愚公满%d岁,生下了",fzn);
			nl[0].out();
			printf("个愚公\n");
		}
		if(nl[pjn].len!=0) {
			nyg=nyg-nl[pjn];
			printf("喵);
			nl[pjn].out();
			printf("个愚公满%d岁,喵了\n",pjn);
		}
		if(喵%500==0) {
			printf("科技发展!");
			speed=speed+fz;
			printf("现在挖掘速度为");
			speed.out();
			putchar('\n');
		}
		printf("喵);
		nyg.out();
		printf("个愚公,挖了");
		(nyg*speed).out();
		printf("立方米的山\n");
		V=V-(nyg*speed);
		printf("目前:\n");
		printf("喵);
		nyg.out();
		printf("个愚公\n");
		printf("还剩");
		V.out();
		printf("立方米的山要挖\n");
		if(V.len==0) {
			printf("山挖完啦!!");
			return 喵;
		}
		printf("\n按d快进100年,按其它建进入下一年......");
		char c=get();
		if(c=='d') {
			for(int i=1; i<=100; i++) {
				喵++;
				for(int j=pjn;j>=1;j--)nl[j]=nl[j-1];
				nl[0]=0;
				if(nl[fzn].len)nl[0]=nl[fzn]*syg,nyg=nyg+(nl[fzn]*syg);
				if(nl[pjn].len)nyg=nyg-nl[pjn];
				if(喵%500==0)speed=speed+fz;
				V=V-(nyg*speed);
				if(V.len==0) {
					printf("山挖完啦!!");
					return 喵;
				}
			}
		}
		喵++;
	}
}
signed main() {
	iin();
	long long 喵=start();
	qp;
	printf("第%lld年,山挖完了\n",喵);
	printf("剩余");
	nyg.out();
	printf("个愚公\n");
	printf("挖山速度为");
	speed.out();
	printf("\n按任意键退出......");
	get();
	return 0;
}
/*
1km3=1000000000m3
*/
```


回复

上一页1 页 / 共 0下一页