#include<iostream>
#include<string>
#include<cstdio>
#include<windows.h>
#include<conio.h>
#include<algorithm>
using namespace std;
const int text1=17500000;
const int text2=88;
const unsigned long long LLMAX=9223372036854775807;
void COLOR_PRINT(char s, int color){ //彩色输出
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | color);
printf("%c",s);
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | 7);
} //借用 https://blog.****.net/qq_42885747/article/details/103835671
void col_string(string s,int color){ //彩色输出
int len=s.length();
for(int i=0;i<len;i++){
COLOR_PRINT(s[i],color);
}
}
void slow(int x,char c,int y){ //缓慢输出
for(int i=1;i<=x;i++){
COLOR_PRINT(c,8);
for(int j=1;j<=y;j++);
}
}
void stp(int x){ //停止
for(int i=1;i<=x;i++);
}
string doc[50]{ //输出文档
"\n这里有两个数字黑洞:",
"1.冰雹猜想",
"2.圣经数",
"冰雹猜想定义:\n对任意一个自然数n,如果他是奇数则对它乘3加1;\n如果它是偶数,则对它除以2。\n\n如此反复运算,最终都能够得到1。即",
"奇数:n = 3×n+1\n偶数:n = n÷2",
"圣经数定义:任意取一个是3的倍数的自然数。\n求出这个数各个数位上的立方和,得到一个新数;\n然后再求出这个新数各个数位上的立方和,又得到一个新数。\n\n如此重复运算下去,最后一定掉入数字黑洞153之中。"
"例如:\n69是3的倍数,按照数字黑洞153的规则,它的变换规则如下:\n6^3+9^3=945,9^3+4^3+5^3=918,9^3+1^3+8^3=1242,1^3+2^3+4^3+2^3=81,8^3+1^3=513,5^3+1^3+3^3=153,……",
"请输入黑洞编号(1或2,其他返回主界面)。"
};
void sstr(int x,string s,int col){ //col_string与slow的结合
int len=s.length();
for(int i=0;i<len;i++){
COLOR_PRINT(s[i],col);
for(int j=1;j<=x;j++);
}
}
/*
8^3+1^3=513,
5^3+1^3+3^3=153,
*/
long long str_ll(string s){ //string转long long
int len=s.size();
long long ans=0;
for(int i=0;i<len;i++){
ans = ans*10+s[i]-'0';
}
return ans;
}
unsigned long long str_ull(string s){ //string转unsigned long long
int len=s.size();
unsigned long long ans=0;
for(int i=0;i<len;i++){
ans = ans*10+s[i]-'0';
}
return ans;
}
long long pow3(int x){ //立方,圣经数用(当时不会使cmath pow)
return x*x*x;
}
/*
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 10 = 淡绿色
3 = 浅绿色 11 = 淡浅绿色
4 = 红色 12 = 淡红色
5 = 紫色 13 = 淡紫色
6 = 黄色 14 = 淡黄色
7 = 白色 15 = 亮白色
*/
int main(){
// cout<<str_ll("123")<<endl;
//前奏
slow(45,'-',7800000);
slow(5,'*',7800000);
// cout<<doc[5];
printf("数");
stp(8000000);
printf("字");
stp(8000000);
printf("黑");
stp(8000000);
printf("洞");
stp(8000000);
slow(5,'*',7800000);
slow(45,'-',7800000);
cout<<endl;
while(true){
sstr(15000000,"\n主页面\n1.数字黑洞\n2.数字黑洞定义\n3.update\n请输入1,2,3中的一个数字,其他数字退出程序。",4);
int a;
cin>>a;
if(a==1){
while(true){
//正片开始
sstr(text1,doc[0],14);
cout<<endl;
sstr(text1,doc[1],14);
cout<<endl;
sstr(text1,doc[2],14);
cout<<endl<<endl;
sstr(text1,doc[6],14);
cout<<endl;
int n;
cin>>n;
if(n==1){ //冰雹猜想
while(true){
col_string("请输入一个正整数(-1退出,切换黑洞):\n",4);
string s;
cin>>s;
if(s=="-1"){
break;
}
if(s=="0"){
col_string("错误!请输入一个正整数!\n",4);
continue;
}
if(s=="-"){
col_string("错误!请输入一个数!\n",4);
continue;
}
bool flag1=false; //小数
int cnt1=0;
bool flag3=false; //符号
int len=s.length();
for(int i=0;i<len;i++){
if(s[i]=='.'){
if(i==0){
flag3 = true;
}
else if(!flag3){
flag1 = true;
}
cnt1++;
}
else if(i==0&&s[i]=='-'){
continue;
}
else if(s[i]<'0'||s[i]>'9'){
flag3 = true;
}
}
if(s[0]=='-'){
if(s.length()==1||flag3||flag1){
col_string("错误!请输入一个数!\n",4);
}
else{
col_string("错误!请输入一个正整数!\n",4);
}
continue;
}
if(flag3){
col_string("错误!请输入一个数!\n",4);
continue;
}
if(flag1){
if(cnt1>1){
col_string("错误!请输入一个数!\n",4);
continue;
}
col_string("错误!请输入一个整数!\n",4);
continue;
}
unsigned long long nb=str_ull(s);
if((len>19||(len==19&&nb>(unsigned long long)(9223372036854775807)))){
col_string("输入的数太大,请输入一个小于等于9223372036854775807的数!\n",4);
continue;
}
long long num=str_ll(s);
//黑洞部分
int cnt=1;
while(true){
long long tmp=num;
string tmp2;
if(num%2==1){ //奇数
if((unsigned long long)(tmp*3+1)>LLMAX){
col_string("变换数值过大……\n",4);
break;
}
num = num*3+1;
tmp2 = "*3+1 = ";
}
else{ //偶数
num /= 2;
tmp2 = "/2 = ";
}
col_string("第"+to_string(cnt)+"次变换:"+to_string(tmp)+tmp2+to_string(num)+";\n",14);
stp(88);
if(num==1){
col_string("……\n\n",4);
break;
}
cnt++;
}
}
}
else if(n==2){ //圣经数
while(true){
col_string("请输入一个是3的倍数的正整数(-1退出,切换黑洞):\n",4);
string s;
cin>>s;
if(s=="-1"){
break;
}
if(s=="0"){
col_string("错误!请输入一个正整数!\n",4);
continue;
}
if(s=="-"){
col_string("错误!请输入一个数!\n",4);
continue;
}
bool flag1=false;
int cnt1=0;
bool flag3=false;
bool flag4=false;
int len=s.length();
long long sum=0;
for(int i=0;i<len;i++){
if(s[i]=='.'){
if(i==0){
flag3 = true;
}
else if(!flag3){
flag1 = true;
}
cnt1++;
}
else if(i==0&&s[i]=='-'){
continue;
}
else if(s[i]<'0'||s[i]>'9'){
flag3 = true;
}
}
if(s[0]=='-'){
if(s.length()==1||flag3||flag1){
col_string("错误!请输入一个正整数!\n",4);
}
col_string("错误!请输入一个正整数!\n",4);
continue;
}
if(flag3){
col_string("错误!请输入一个数!\n",4);
continue;
}
if(flag1){
if(cnt1>1){
col_string("错误!请输入一个数!\n",4);
continue;
}
col_string("错误!请输入一个整数!\n",4);
continue;
}
if(sum%3!=0){
col_string("请输入一个是3的倍数的整数!\n",4);
continue;
}
unsigned long long nb=str_ull(s);
if(len>19||(len==19&&nb>(unsigned long long)(9223372036854775807))){
col_string("输入的数太大,请输入一个小于等于9223372036854775807的数!\n",4);
continue;
}
// if(flag1){
// if(flag4){
// col_string("错误!请输入一个正整数!\n",4);
//
// continue;
// }
//
// if(cnt1>1){
// col_string("错误!请输入一个数!\n",4);
//
// continue;
// }
//
// col_string("错误!请输入一个整数!\n",4);
//
// continue;
// }
// else if(flag3){
// col_string("错误!请输入一个数!\n",4);
//
// continue;
// }
long long num=str_ll(s);
int cnt=0;
while(true){
cnt++;
if(num==153){
col_string("……\n\n",4);
break;
}
long long tmp=num;
long long sum=0;
string s;
while(tmp){
int g=tmp%10;
sum += pow3(g);
tmp /= 10;
s += to_string(g)+"^3+";
}
int len=s.length();
s.erase(len-1);
col_string("第"+to_string(cnt)+"次变换:"+s+"="+to_string(sum)+";\n",14);
num = sum;
}
}
}
else{
break;
}
}
}
else if(a==2){
sstr(19876543,"\n在浩瀚的宇宙中,存在着一种其质量巨大而体积却十分微小的天体,它有着无比强大的引力,能够吞噬任何在它附近的物质,就连光也无法逃脱。\n在天文学中,把这种不可思议的天体叫作“黑洞”。\n",14);
sstr(100000,"请按任意键继续。",8);
char nt;
nt = getch();
printf("\r \r");
sstr(19876543,"在数学中,也有着一种神秘而有趣的“数字黑洞”现象。\n所谓数字黑洞,就是无论如何设定初始数值,在某种黑洞规则下,经过反复选代后,最终都会得到固定的一个数值,或者陷入一组数的循环之中,就像宇宙中的黑洞吞它周围的物质一样。\n",14);
sstr(100001,"请按任意键继续。",8);
nt = getch();
printf("\r \r");
sstr(5000000,"\n这里给出了两个数字黑洞的定义:\n",8);
sstr(22000000,doc[3],6);
cout<<endl;
sstr(22000000,doc[4],6);
cout<<endl;
cout<<endl<<endl;
sstr(text1,doc[5],14);
cout<<endl;
sstr(100001,"请按任意键继续。",8);
nt = getch();
printf("\r \r");
sstr(10000001,"\n拓展:其他数字黑洞:\n1.西西弗斯黑洞\n2.卡布雷西而黑洞\n3.数字黑洞1和4\n",6);
}
else if(a==3){
printf("\nUpdate:\n");
printf("2024-03-23 V1.0 编写初始框架\n");
printf("2024-03-24 V1.2 完善“冰雹猜想”部分\n");
printf("2024-03-24 V1.3 修复漏洞,添加黑洞定义部分\n");
printf("2024-03-25 V1.3.1 修复漏洞,添加Update\n");
printf("2024-03-26 V1.4 修复换行漏洞,完善圣经数部分\n");
printf("2024-05-26 V1.4.1 修复输出漏洞(圣经数部分),添加少数注释\n");
printf("2024-08-04 V1.4.2 修复部分判断漏洞\n");
}
else{
break;
}
}
/*
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 10 = 淡绿色
3 = 浅绿色 11 = 淡浅绿色
4 = 红色 12 = 淡红色
5 = 紫色 13 = 淡紫色
6 = 黄色 14 = 淡黄色
7 = 白色 15 = 亮白色
*/
cout<<"\nBye!"<<endl;
return 0;
}