诚心求教,请教这个算法怎么做
界面如图
有六个数字,1-6,1和6又是相接的,即6结束后下一个数字又是1
输入开始数字和结束数字,按顺序数数字,如果一个数字被勾上,就表示这个数字不能数了。
比如开始数字是3,结束数字是5,如果中间的4没勾上,那就是3,4,5,结果显示顺数。
中间的4被勾上了,顺数就数不过去,但是可以3,2,1,6,5,反过来数到5,就表示可以逆数,那么结果中就显示逆数。
如果顺数和逆数都可以,就取数的次数少的,如果都数不出来,就显示不能数
--------------------编程问答-------------------- 設置兩個bool值
boolean Asc = true;//順序方向如果起始兩個數字之間沒有打鉤的數字則為true
boolean Desc = trur;//倒序方向如果起始兩個數字之間沒有打鉤的數字則為true
而後對六個選項進行判斷,當打鉤的數字大於起始數字,小於結束數字時
Asc = false;
反之則
Desc = false;
最後將有三種情況:
1、都是true
//說明沒有打鉤數字
int interval = endInt - startInt + 1;//計算次數,超過4就倒序,否則就順序
2、都是false
//說明兩個方向都不行
messagebox.show("無法計數");
3、一個true一個false
//Asc是true則順序 Desc是true則倒序
.....
這是我的思路,希望能幫上忙 --------------------编程问答--------------------
好像有两个情况没考虑到,应该是我描述不够详细。
1.可能同时会有多个数字被勾上
2.起始数字可能会比结束数字大,比如说起始数字6,结束数字4
你给的这个判断也很模糊“當打鉤的數字大於起始數字,小於結束數字時”
这个逗号是且还是或呢? --------------------编程问答-------------------- 就逻辑判断,这都不是很难的吧,你自己都列的那么清楚,难道动手写下判断写不了? --------------------编程问答-------------------- 1、將勾選的所有數字作遍歷,也就是循環判斷,當兩個boolean值都為false就可以中斷跳出
2、這個問題可以對textbox裏面的內容作限制,當結束數字小於起始數字
buttonCalc.enabled = false;//計算按鈕不可用
3、“當打鉤的數字大於起始數字且小於結束數字時”這個判斷應該很好懂的。
當然還有如果打鉤數字就是起始或者結束數字時的判斷你也要考慮進去 --------------------编程问答-------------------- 我覺得自己還是要多思考的好,我的大思路還是比較清楚的,細節方面你自己要微調下的。
這個題目並不難。你是學生麼?直接要答案並不利於你的學習。
這是忠告 --------------------编程问答-------------------- List<int> checkedNum = new List<int>();
if (checkBox1.Checked) checkedNum.Add(1);
if (checkBox2.Checked) checkedNum.Add(2);
if (checkBox3.Checked) checkedNum.Add(3);
if (checkBox4.Checked) checkedNum.Add(4);
if (checkBox5.Checked) checkedNum.Add(5);
if (checkBox6.Checked) checkedNum.Add(6);
int start = int.Parse(textBox1.Text);
int end = int.Parse(textBox2.Text);
if (start > end) { int t = start; start = end; end = t; }
bool b1 = checkedNum.All(x => x < start || x > end); //能否顺数
bool b2 = checkedNum.All(x => x > start && x < end); //能否倒数
if (!b1 && !b2)
{
MessageBox.Show("不能数");
}
else
{
if (b1 && b2)
{
if (end - start <= 3) MessageBox.Show("正数"); else MessageBox.Show("倒数");
}
else
{
if (b1) MessageBox.Show("正数"); else MessageBox.Show("倒数");
}
} --------------------编程问答--------------------
--------------------编程问答--------------------
int Alg(int begin, int end, int max, int mark)
{
if (begin == end || max < begin || max < end || begin <= 0 || end <=0 || mark <=0 || mark > max )
{
//error;
return -3;
}
int ascLen = 0;
int dscLen = 0;
int i = begin;
for (; ; )
{
i = i % max + 1;
ascLen++;
if (i == end)
{
break;
}
if (i == mark)
{
ascLen = Int32.MaxValue;
break;
}
}
i = begin;
for (; ; )
{
i = (i + max - 2 )% max + 1;
dscLen++;
if (i == end)
{
break;
}
if (i == mark)
{
dscLen = Int32.MaxValue;
break;
}
}
if (ascLen < dscLen)
{
return 1;//顺序
}
else if (ascLen > dscLen)
{
return -1; //逆序
}
else
{
if (dscLen != Int32.MaxValue)
{
return 0;//都可以
}
else
{
return -2;//不能数
}
}
}
--------------------编程问答-------------------- 我先mark一下,写好来回复代码。 --------------------编程问答--------------------
private void button1_Click(object sender, EventArgs e)
{
int[] CheckedNumber = new int[6];
if (chb1.Checked) CheckedNumber[0] = 1;
if (chb2.Checked) CheckedNumber[1] = 2;
if (chb3.Checked) CheckedNumber[2] = 3;
if (chb4.Checked) CheckedNumber[3] = 4;
if (chb5.Checked) CheckedNumber[4] = 5;
if (chb6.Checked) CheckedNumber[5] = 6;
txtResult.Text = "";
int start = Convert.ToInt32(txtStart.Text);
int end = Convert.ToInt32(txtEnd.Text);
int temp1 = start;
int temp2 = start;
List<int> PrintNumberAdd=new List<int>();
List<int> PrintNumbersubtract = new List<int>();
int[] PrintNumberAddIArr;
int[] PrintNumbersubtractIArr;
bool IsAdd = true;
bool IsSubtract = true;
for (int i = 0; i <6; i++)
{
if (temp1 == 7) temp1 = 1;
int numL = Array.IndexOf(CheckedNumber, temp1);
if (numL != -1)
{
IsAdd = false;
break;
}
else
{
PrintNumberAdd.Add(temp1);
if(temp1==end)break;
}
temp1++;
}
for (int j = 0; j <6; j++)
{
if (temp2 == 0) temp2 = 6;
int numR = Array.IndexOf(CheckedNumber, temp2);
if (numR != -1)
{
IsSubtract = false;
break;
}
else
{
PrintNumbersubtract.Add(temp2);
if(temp2==end)break;
}
temp2--;
}
PrintNumberAddIArr = PrintNumberAdd.ToArray();
PrintNumbersubtractIArr = PrintNumbersubtract.ToArray();
if (!(IsAdd || IsSubtract))
{
txtResult.Text = "不能数";
}
else if (IsAdd && IsSubtract)
{
if (PrintNumberAddIArr.Length < PrintNumbersubtractIArr.Length)
{
foreach (var i in PrintNumberAddIArr)
{
txtResult.Text += i.ToString() + " ";
}
}
else
{
foreach (var i in PrintNumbersubtractIArr)
{
txtResult.Text += i.ToString() + " ";
}
}
}
else
{
if (IsAdd)
{
foreach (var i in PrintNumberAddIArr)
{
txtResult.Text += i.ToString() + " ";
}
}
else
{
foreach (var i in PrintNumbersubtractIArr)
{
txtResult.Text += i.ToString() + " ";
}
}
}
}
bool[] flag = { false, true, false, true, false, false };//模拟checkbox--------------------编程问答--------------------
int[] res = { 0, 0 };//保存结果
int begin = 3;//起数
int end = 5;//止数
int n = begin - 1;//控制循环
//尝试顺数
while (true)
{
if (flag[n])
{
break;//checkbox被勾选,顺数失败
}
if (n == end - 1)
{
res[0] = end - begin + 1;//顺数成功,计算取数次数
break;
}
n++;
}
n = end - 1;//控制循环
//尝试逆数
while (true)
{
if (flag[n])
{
break;//checkbox被勾选,逆数失败
}
if (n == begin - 1)
{
res[1] = 6 - (end - begin) + 1;//逆数成功,计算取数次数
break;
}
n = n >= 5 ? 0 : n + 1;
}
//计算结果:
if (res[0] != 0 || res[1] != 0)
{
if (res[0] > res[1])
{
Console.WriteLine("顺数");
}
else
{
Console.WriteLine("逆数");
}
}
else
{
Console.WriteLine("不能数");
}
sorry,最后计算机过的地方判断的符号错了,应该是小于,我写成大于了 --------------------编程问答-------------------- 我也写了一个,一口气哈有代码冗余,但经过测试可以正确计算。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
private node[] myNode = new node[6];
public Form1()
{
InitializeComponent();
}
//开始计算
private void button1_Click(object sender, EventArgs e)
{
getNodes();//按check状态生成节点
int ibegin = int.Parse(txtBegin.Text.Trim());//取开始值
int iend = int.Parse(txtEnd.Text.Trim());//取结束值
this.lbResult.Text = make((ibegin - 1), (iend - 1));//开始计算数据
}
private void getNodes()
{
//初始化节点
lbResult.Text = "";
int i = 5;
for (int n = 0; n < 6; n++)
{
myNode[n] = new node();
}
//按控件的勾选状态修改节点状态
foreach (Control cl in this.Controls)
{
if (cl is CheckBox)
{
if (((CheckBox)cl).Checked == true)
{
lbResult.Text = lbResult.Text + cl.Text + "勾选了<br>";
myNode[i].text = cl.Text;
myNode[i].check = true;
}
else
{
lbResult.Text = lbResult.Text + cl.Text + "未<br>";
myNode[i].text = cl.Text;
myNode[i].check = false;
}
i = i - 1;
}
}
//节点之间的关联
for (int j = 0; j < 6; j++)
{
if (j == 0) { myNode[0].previous = myNode[5]; myNode[0].next = myNode[1]; }
else if (j == 5) { myNode[5].next = myNode[0]; myNode[5].previous = myNode[4]; }
else
{
myNode[j].previous = myNode[j - 1];
myNode[j].next = myNode[j + 1];
}
}
}
//正顺计算数据
private string make(int begin, int end)
{
node nowNode = new node();
string result = "";
nowNode = myNode[begin];
bool f = true;
for (int i = 0; i < 6; i++)
{
if (nowNode.text == myNode[end].text) { return result + myNode[end].text; }
if (nowNode.check == false)
{
result = result + nowNode.text;
}
else
{
f = true;//找到了勾选的跳出
break;
}
nowNode = nowNode.next;
}
if (f)
{
return makeRev(begin, end);//说明中间有勾选则反向取值
}
else
{
return result;
}
}
//反向计算数据
private string makeRev(int begin, int end)
{
node nowNode = new node();
string result = "";
nowNode = myNode[begin];
bool f = true;
for (int i = 0; i < 6; i++)
{
if (nowNode.text == myNode[end].text) { return result + myNode[end].text; }
if (nowNode.check == false)
{
result = result + nowNode.text;
}
nowNode = nowNode.previous;
}
return result;
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
//节点模型
class node
{
public node previous;
public node next;
public string text;
public bool check;
}
} --------------------编程问答-------------------- 除
补充:.NET技术 , C#