//用的PASCAL寫的不知道看不看的懂整體思路
//應該就是這個樣子的語言實現就無所謂了
//程序不完整有帶改善~_~!
var a,b:Integer;
k:Integer;
k2:Integer;
i,j,m:Integer;
key:boolean; //退出循環條件(成功匹配)
Count:integer; //判斷程序上半段是否成功
begin
key:=False;
Count:=0;
a:=StrToInt(Edta.text);
b:=StrToInt(Edtb.Text);
k:=a*b;
k2:=2*k;
for m:=k+1 to k2 do
begin
for i:=0 to 2*b do
begin
for j:=0 to 2*a do
begin
if i*a+j*b = m then
begin
key:=true;
break;
end;
end;
if key then
break;
end;
if not key then
begin
Count:=Count+1;
showMessage(intToStr(m));
end
else
key:=False;
end;
//以上用來判斷是否可無限循環 m 為兩數最小公因數(這里用乘機替代了,用公因數替代M即可)
//如果上面判斷無異常就說明可循環再從最小公因數開始用循環來取其最大一個不能實現的分數後挑出循環即可
if Count> 0 then
begin
key:=False;
for m:=k downto b do
begin
for i:=0 to b do
begin
for j:=0 to a do
begin
if i*a+j*b = m then
begin
key:=true;
break;
end;
end;
if key then
begin
break;
end
end;
if not key then
begin
showMessage('Your is:'+intToStr(m));
end;
key:=False;
end;
end;
end;
2. 怎樣快速判斷一個編程題用什麽樣的演算法
這個要靠積累,見的題多了,自然能很快地選擇合適的演算法。
還要有比較豐富的知識,比如你想求一元二次方程的根,你要知道根的計算公式。想求是不是閏年,你要了解閏年的判斷規則。
其實最主要的是經驗,要多練,看一些經典類型的題目,如排序,循環,數組,可以挑一些感興趣的題目練習一下。
3. 一道編程題 求演算法思路.
因為n比較小,此題最優的解法是雙向搜索
做法如下(n=20):
枚舉前十個數的放入集合的放法,共3^10種,以兩個集合的元素差為key,兩個集合的元素和為value,存入哈希表
枚舉後十個數的放入集合的放法,以兩個集合的元素差為key,查哈希表,這樣能查到對應的前十個數的分配方法,就知道總和了
這是最優解法,復雜度為3^(n/2)
這題還有一種經典的動態規劃的解法,叫「雙塔問題」,復雜度為w*n,w為所有數的總和
4. python演算法編程題,求代碼
這道題的核心在於設計演算法:
根據描述:這道題的編程思路應該是這樣的:任意三個數的和除以2=剩餘三個數中的任意兩數的平均值=游戲機的價格。
可以這樣做,把六個數放入數組中,做一個多層嵌套循環遍歷所有組合,當滿足上述條件時執行一個返回結果的動作,可能有不止一個答案。
5. C語言編程題
一 根據演算法寫gcd函數
int gcd(int m, int n)
{
long s;
if (n == 0)
s = m;
else
s = gcd(n, m % n);
return s;
}
二 main主函數調用gcd函數測試
int main() {
int n, m, t;
while (true)
{
printf("輸入兩個數,用空格分開:
");
scanf("%d %d", &m, &n);
t = gcd(m, n);
printf("最大公約數:%d
", t);
}
}
三 運行結果
6. java編程題演算法公式
總共150響,代碼如下
public static void main(String[] args) {
Map<Integer,String> bombCount = new HashMap<Integer, String>();
for (int i = 1; i <= 100; i++) {
Integer aBombTime = 1*i;
Integer bBombTime = 2*i;
Integer cBombTime = 3*i;
String tempA = bombCount.get(aBombTime);
if(tempA == null){
bombCount.put(aBombTime, "a");
}
String tempB = bombCount.get(bBombTime);
if(tempB == null){
bombCount.put(bBombTime, "a");
}
String tempC = bombCount.get(bBombTime);
if(tempC == null){
bombCount.put(cBombTime, "a");
}
}
System.out.println("All bomb count = " + bombCount.size());
}
7. c語言機試編程題答題技巧
機試一般第一題好像是改錯第二題是填空
,第三題才是寫一個程序的演算法部分就可以了,所以第一題要答好,你要能注意編程的一些小細節,和大部分語句的編寫和關鍵詞的意義。第二題要看懂題意差不多就會了
所以要多讀題,第三個就是多做題了,記住一些規律性的題目。
8. 關於演算法編程題(C語言實現)
char *a; //字元串 改為 char a[20];//存放字元串的字元數組
int jie; //方程的解 改為 double jie;
dy = 0; 刪去 dy=0;
兩處的 for(i=1;i<=z;i++) 都改為 for(i = 0; i < z; i++)
if (a[i] == '==' ) 改為 if (a[i] == '=' )
{z=i; 改為 {dy = i;
a=0;b=0; 刪去 a=0;b=0;
fun(a,1,dy,&b,&c); 改為 fun(a, 0, dy - 1, &b, &c);
fun(a,dy,z,&b,&c); 改為 fun(a, dy + 1, z - 1, &b, &c);
jie=(d-b)/(e-c); 改為 jie=((double)(d-b))/(e-c);
printf("%c = %d",zm,jie); 改為 printf("%c = %f",zm,jie);
9. c#編程題-演算法
usingSystem;
usingSystem.Linq;
usingSystem.Text.RegularExpressions;
namespaceConsoleApp
{
internalclassProgram
{
privatestaticvoidMain(string[]args)
{
inta=-1;
intb=-1;
intnumber=0;
intmin=0;
intmax=1000000;
Console.WriteLine("請輸入要測試的整數區間,以空格隔開:");
string[]array=Console.ReadLine().Split('');
if(array.Length!=2||!IsNumberic(array[0],outa)||!IsNumberic(array[1],outb))
{
Console.WriteLine("區間輸入錯誤,程序退出");
return;
}
if(a>min&&a<=b&&b<max)
{
for(inti=a;i<=b;i++)
{
if(Palindrome(i))
number++;
}
}
else
{
Console.WriteLine("區間輸入錯誤,程序退出");
}
Console.WriteLine("該區間內的迴文數為{0}個",number);
Console.Read();
}
privatestaticboolPalindrome(intnumber)
{
stringstrNumer=number.ToString();
returnnewString(number.ToString().Reverse().ToArray()).Equals(strNumer);
}
privatestaticboolIsNumberic(stringmessage,outintresult)
{
varrex=newRegex(@"^d+$");
result=-1;
if(!rex.IsMatch(message))
returnfalse;
result=int.Parse(message);
returntrue;
}
}
}
10. java演算法編程題
putAll(4)運行結果:
4=1+1+1+1
4=1+1+2
4=1+2+1
4=1+3
4=2+1+1
4=2+2
4=3+1
static
void
putAll(int
n)
{
for(int
i=1;i<n;i++)
{
putAllRec(n+"="+i,
n-i);
System.out.println(n+"="+i+"+"+(n-i));
}
}
static
void
putAllRec(String
prefix,
int
n)
{
for(int
i=1;i<n;i++)
{
putAllRec(prefix+"+"+i,
(n-i));
System.out.println(prefix+"+"+i+"+"+(n-i));
}
}
另外提供一個不用遞歸的方法,同樣的輸出:
static
void
putAll(int
n)
{
int[]
a
=
new
int[n];
for(int
i=0;i<n;i++)
a[i]=1;
int
w
=
n-1;
while(a[0]!=n)
{
System.out.print(n+"="+a[0]);
for(int
i=1;i<=w;i++)
System.out.print("+"+a[i]);
System.out.println();
if(a[w]==1)
{
a[w-1]++;
a[w]--;
w--;
}
else
{
a[w-1]++;
int
t
=
a[w]-1;
for(int
i=0;i<t;i++)
a[w+i]=1;
w+=(t-1);
}
}
}
再附加一個上面這個方法的「精簡」版(同樣輸出,就是代碼少點,沒什麼實際意義):
static
void
putAll(int
n)
{
int[]
a
=
new
int[n];
for(int
i=0;i<n;i++)
a[i]=1;
while(a[0]!=a.length)
{
System.out.print(a.length+"="+a[0]);
for(int
i=1;i<n;i++)
System.out.print("+"+a[i]);
System.out.println();
a[n-2]++;
if(a[n-1]==1)
a[(n--)-1]--;
else
for(int
i=a[(n--)-1]-1;i>0;i--)
a[(++n)-1]=1;
}
}