6174数字黑洞计算的一个c#程序实现(原创)
先上结果:
两位数的数字黑洞(只有一组):
09,81,63,27,45
三位数的数字黑洞(只有一个):
495
四位数的数字黑洞(只有一个):
6174
五位数的数字黑洞(共三组):
第一组:74943,62964,71973,83952
第二组:63954,61974,82962,75933
第三组:53955,59994
六位数的数字黑洞(一组加两个):
第一组:,,,,,,
第二个:
第三个:
七位数的数字黑洞(只有一组):
,,,,,,,
八位数的数字黑洞(两组加两个):
第一组:,,
第二组:,,,,,,
第二个:
第三个:
九位数的数字黑洞(一组加两个):
,,,,,,,,,,,,,
第二个:
第三个:
十位数的数字黑洞(五组加三个):
第一组:,,
第二组:,,
第三组:,,
第四组:,,
第五组:,,,,,,
第六个:
第七个:
第八个:
再上界面:
再上代码:
public partial class MathQues : Form
{
static int calcuAmount=0;
public MathQues()
{
InitializeComponent();
}
private void calculate6174()
{
if (textBox1.Text == “”)
return;
bool isNumber = System.Text.RegularExpressions.Regex.IsMatch(textBox1.Text, @”^(-)?[1-9][0-9]*$”);
if (!isNumber)//不是整数
{
MessageBox.Show(“数字位数必须是整数!”); return;
}
this.Text = “正在进行 ” + textBox1.Text + ” 位数的6174变换,请勿中断程序运行!”;
DateTime bTime = DateTime.Now;
listBox2.Items.Add(“开始时间:” + bTime.ToString());
calcuAmount = 0;
kTransform();
label1.Visible = false;
textBox1.Visible = false;
button2.Visible = false;
saveToFile(bTime);
}
private void saveToFile(DateTime bTime)
{
listBox2.Items.Add(textBox1.Text + ” 位数共计算了 ” + calcuAmount.ToString() + ” 个数”);
DateTime eTime = DateTime.Now;
listBox2.Items.Add(“结束时间:” + eTime.ToString());
string dateDiff = null;
TimeSpan bts = new TimeSpan(bTime.Ticks);
TimeSpan ets = new TimeSpan(eTime.Ticks);
TimeSpan ts = ets.Subtract(bts).Duration();
dateDiff = ts.Days.ToString() + “天”
+ ts.Hours.ToString() + “小时”
+ ts.Minutes.ToString() + “分钟”
+ ts.Seconds.ToString() + “秒”;
listBox2.Items.Add(“耗时:” + dateDiff);
//保存到文本文件
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = “文本文件 (*.txt)|*.txt”;
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.Title = “导出数据到文本文件”;
string fileName;
if (saveFileDialog.ShowDialog() == DialogResult.OK)
fileName = saveFileDialog.FileName;
else
return;
FileStream fs = null;
fs = new FileStream(fileName, FileMode.Create);
StreamWriter txtWriter = new StreamWriter(fs, Encoding.GetEncoding(“GB2312”));
for (int i = 0; i < listBox2.Items.Count; i++)
{
txtWriter.Write(listBox2.Items[i].ToString());
txtWriter.Write(“\r\n”);
}
txtWriter.Flush();
txtWriter.Close();
}
private void kTransform()
{
double value = 0;
listBox1.Items.Clear();
listBox2.Items.Clear();
int NumberCount = Convert.ToInt16(textBox1.Text);//数字位数
string digitNumberStr = “”;
for (int i = 0; i < NumberCount; i++)
digitNumberStr = digitNumberStr + “1”;//11…11(位数那么多)
long limit = Convert.ToInt64(digitNumberStr) * 9;//计算循环上限
ArrayList list1 = new ArrayList();
long[] repeatNumbers = new long[8];
for (int i = 0; i < 8; i++)
{
int f = i + 1;
repeatNumbers[i] = Convert.ToInt64(digitNumberStr) * f;//得到所有重复数字
};
long step = (limit + 1) / 10;//上限加1除以十,作步长
int stepUnit = 1;
long start = step * stepUnit;
for (long i = start; i < limit; i++)
{
if (repeatNumbers.Contains(i) || i == 0)//排除完全重复的数值,排除对称数
{
stepUnit++; i = step * stepUnit;
}
value = i;
string str = addZero(value.ToString(), NumberCount);//补齐位数
str = sortReStr(str); //从大到小
if (!list1.Contains(str))//去掉排序后的重复值
list1.Add(str);
}
//只计算非重复值
for (int i = 0; i < list1.Count; i++)
{
string str = list1[i].ToString();
if (!listBox1.Items.Contains(str) && !listBox1.Items.Contains(sortStr(str)) && !listBox1.Items.Contains(sortReStr(str)))//本次计算出现
{
calcuAmount++;
calResault(str, NumberCount);//计算
}
}
}
//从小到大
private string sortStr(string str)
{
ArrayList listAsc = new ArrayList();
for (int i = 0; i < str.Length; i++)
listAsc.Add(str.Substring(i, 1));//数字分解开来
listAsc.Sort();//数字升序排序
str = “”;
for (int i = 0; i < listAsc.Count; i++)
str = str + listAsc[i].ToString();
return str;
}
//从大到小
private string sortReStr(string str)
{
ArrayList listAsc = new ArrayList();
for (int i = 0; i < str.Length; i++)
listAsc.Add(str.Substring(i, 1));//数字分解开来
listAsc.Sort();//数字升序排序
str = “”;
for (int i = 0; i < listAsc.Count; i++)
str = str + listAsc[listAsc.Count-1-i].ToString();
return str;
}
private void calResault(string originalValueStr, int NumberCount)
{
ArrayList list1 = new ArrayList();
string valueStr = originalValueStr;
listBox1.Items.Add(“第”+calcuAmount .ToString()+ “个(原始数据):” + valueStr);
for (; ; )
{
double value = calValue(valueStr, NumberCount);//得到新值
valueStr = addZero(value.ToString(), NumberCount);//排序并补齐位数
if (list1.Contains(valueStr)) //本次原始数据计算出现重复
{
getCircle(valueStr, list1, originalValueStr);//保存循环到listBox2
listBox1.Items.Add(“(新黑洞):”+ valueStr);//把重复值也保存到listBox1
return;//下一个数
}
//本次原始数据计算未出现重复
list1.Add(valueStr);//保存到list1
//若计算结果和之前某个原始数据或其计算过程出现过的数字等价?
if (listBox1.Items.Contains(valueStr) || listBox1.Items.Contains(sortStr(valueStr)) || listBox1.Items.Contains(sortReStr(valueStr)))
{
listBox1.Items.Add(“(旧黑洞):” + valueStr);
return;//返回计算下一个数
}
listBox1.Items.Add(valueStr);//否则保存到listBox1
}
}
private void getCircle(string str, ArrayList list1, string originalValueStr)
{
listBox2.Items.Add(“(“+originalValueStr + “变换的黑洞):”);
int start = 0;
for (int i = 0; i < list1.Count; i++)
{
if (list1[i].ToString() == str)
start = i;
}
for (int i = start; i < list1.Count; i++)
{
listBox2.Items.Add(list1[i].ToString());
}
listBox2.Items.Add(str);
}
//最前面补0
private string addZero(string valueStr, int NumberCount)
{
int count = valueStr.Length;
int diff = NumberCount – count;
string zero = “”;
for (long i = 0; i < diff; i++)
zero = zero + “0”;
valueStr = zero + valueStr;
return valueStr;
}
//把数字从大到小排序然后减去从小到大排序
private double calValue(string valueStr, int NumberCount)
{
ArrayList listAsc = new ArrayList();
for (int i = 0; i < NumberCount; i++)
listAsc.Add(valueStr.Substring(i, 1));//数字分解开来
listAsc.Sort();//数字升序排序
ArrayList listDesc = new ArrayList();
for (int i = 0; i < NumberCount; i++)
listDesc.Add(listAsc[NumberCount – 1 – i]);//倒过来
double newkValue = 0;
double revNewkValue = 0;
for (int j = 0; j < NumberCount; j++)
{
newkValue = newkValue + Math.Pow(10, j) * Convert.ToInt16(listDesc[NumberCount – j – 1].ToString());
revNewkValue = revNewkValue + Math.Pow(10, j) * Convert.ToInt16(listAsc[NumberCount – j – 1].ToString());
}
double resault = newkValue – revNewkValue;//大减小
return resault;
}
}
今天的文章
数字黑洞153的规律_黑洞数6174原理分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/61184.html