用户:
ENEMY查看: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
*/
```