如题:
a,b,c,d为变量,A为常量。a,b,c,d的取值在1-36(均可等)之间
表达式为a+b+c+d=A,a!=b,b!=c,c!=d
已知A,现任意随机出一组a,b,c,d
举个栗子:
A=72
a=24,b=14,c=5,d=29
...
不可以是
a=24,b=24,c=18,d=6
...
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private int GetAnswer(int end)
{
int num;
Random random = new Random();
num = random.Next(end);
return num;
}//得到随机数字
private bool IsSame(int num_1,int num_2,int num_3,int num_4)
{
bool rtn = false;
ArrayList list = new ArrayList();
list.Add(num_1);
list.Add(num_2);
list.Add(num_3);
list.Add(num_4);
for (int i = 0; i <= list.Count-1;i++)
{
for (int j = i+1; j <= list.Count-1; j++)
{
if (list[i] == list[j])
{
rtn = false;
}
else
{
rtn = true;
}
}
}
return rtn;
}//判断是否有重复
private void GetRight()
{
int anum, bnum, cnum, dnum;
anum = GetAnswer(Convert.ToInt16(txtA.Text));
bnum = GetAnswer(Convert.ToInt16(txtA.Text)-anum);
cnum = GetAnswer(Convert.ToInt16(txtA.Text) - anum-bnum);
dnum = Convert.ToInt16(txtA.Text) - anum - bnum-cnum;
if(IsSame(anum,bnum,cnum,dnum))
{
lbla.Text = anum.ToString();
lblb.Text = bnum.ToString();
lblc.Text = cnum.ToString();
lbld.Text = dnum.ToString();
}
else
{
anum = GetAnswer(Convert.ToInt16(txtA.Text));
bnum = GetAnswer(anum);
cnum = GetAnswer(bnum);
dnum = Convert.ToInt16(txtA.Text) - anum - bnum - cnum;
}
lbla.Text=anum.ToString();
lblb.Text=bnum.ToString();
lblc.Text=cnum.ToString();
lbld.Text=dnum.ToString();
}
private void button1_Click(object sender, EventArgs e)
{
if (txtA.Text == "" || txtA.Text == null)
{
MessageBox.Show("请输入数据A!");
txtA.Focus();
}
else
{
GetRight();
}
}
}
}
没有看到“a,b,c,d的取值在1-36(均可等)” 这个条件 其他的 都还好 要是需要原工程加我qq1101559491
这题太难还是条件不够额
直接穷举就行了,然后自己去优化吧
我学前端的 我用JS写个四层循环可以做这个 C应该差不多
for(var a=1; a<=36; a++){
for(var b=1; b<=36; b++){
for(var c=1; c<=36; c++){
for(var d=1; d<=36; d++){
if(a+b+c+d==72&&a!=b&&b!=c&&c!=d){
document.write(a+","+b+","+c+","+d+"
");
}
}
}
}
}
我做了个测试,发现有5716条数据。cmd运行结果我往上翻只翻到了几百条条数据,还以为是我写错了。。。
int i, j, k, l, count = 0;
bool ck = false;
for (i = 1; i <= 36; i++)
{
for (j = 1; j <= 36; j++)
{
for (k = 1; k <= 36; k++)
{
for (l = 1; l <= 36; l++)
{
if (i == j||j == k||k == l)
continue;
else if (i + j + k + l == 36)
{
ck = true;
Console.WriteLine("a={0},b={1},c={2},d={3}", i, j, k, l);
count++;
}
//if (count == 100)
// break;
}
//if (count == 100)
// break;
}
//if (count == 100)
// break;
}
//if (count == 100)
// break;
}
if (!ck)
Console.WriteLine("不存在a,b,c,d使得a+b+c+d=A,a!=b,b!=c,c!=d");
Console.WriteLine("合计:{0}", count);
Random rd = new Random();
int a,b,c,d;
while(true)
{
a = rd.Next(36);
b = rd.Next(36);
c = rd.Next(36);
d = 72 - a - b - c;
if(b>0&&(a!=b||b!=c||c!=d))
{
break;
}
}
Console.WriteLine("a={0},b={1},c={2},d={3}",a,b,c,d);