取數演算法題
① JAVA演算法題目:int數組內取數相加湊數
首先觀察數組可以排除幾個數:588,4375,5184 因為他們如何相加也不會以0結尾。限於篇幅,部分代碼如下,剩餘的循環可以自己添加下,採用窮舉法:
public class DoMain {
public void doit(){
int[] a = new int[] { 460, 720, 1250, 1800, 2200, 3080, 4100,
6510, 6900, 9000 };
for(int i1=0;i1<a.length;i1++){
for(int i2=i1+1;i2<a.length;i2++){
if(a[i1]+a[i2]==13750){
System.out.println(a[i1]+";"+a[i2]);
}
for(int i3=i2+1;i3<a.length;i3++){
if(a[i1]+a[i2]+a[i3]==13750){
System.out.println(a[i1]+";"+a[i2]+";"+a[i3]);
}
for(int i4=i3+1;i4<a.length;i4++){
if(a[i1]+a[i2]+a[i3]+a[i4]==13750){
System.out.println(a[i1]+";"+a[i2]+";"+a[i3]+";"+a[i4]);
}
for(int i5=i4+1;i5<a.length;i5++){
if(a[i1]+a[i2]+a[i3]+a[i4]+a[i5]==13750){
System.out.println(a[i1]+";"+a[i2]+";"+a[i3]+";"+a[i4]+";"+a[i5]);
}
for(int i6=i5+1;i6<a.length;i6++){
if(a[i1]+a[i2]+a[i3]+a[i4]+a[i5]+a[i6]==13750){
System.out.println(a[i1]+";"+a[i2]+";"+a[i3]+";"+a[i4]+";"+a[i5]+";"+a[i6]);
}
for(int i7=i6+1;i7<a.length;i7++){
if(a[i1]+a[i2]+a[i3]+a[i4]+a[i5]+a[i6]+a[i7]==13750){
System.out.println(a[i1]+";"+a[i2]+";"+a[i3]+";"+a[i4]+";"+a[i5]+";"+a[i6]+";"+a[i7]);
}
}
}
}
}
}
}
}
}
public static void main(String[] args) {
DoMain main= new DoMain();
main.doit();
}}
② JAVA演算法題目:int數組內取數相加湊數
public class Que1 {
Vector<Vector<Integer>> all = new Vector<Vector<Integer>>();
int[] array = new int[] { 460, 588, 720, 1250, 1800, 2200, 3080, 4100,
4375, 5184, 6510, 6900, 9000 };
public Que1() {
for (int i = 0; i < array.length; i++) {
Vector<Integer> v = new Vector<Integer>();
pro(v, i);
}
for (int i = 0; i < all.size(); i++) {
System.out.println(all.get(i).toString());
}
}
private boolean pro(Vector<Integer> v, int index) {
v.add(array[index]);
int sum = sum(v);
if (sum <= 13750) {
if (sum == 13750) {
all.add((Vector<Integer>) v.clone());
v.remove(v.size() - 1);
return true;
}
for (int i = index + 1; i < array.length; i++) {
if (!pro(v, i)) {
break;
}
}
v.remove(v.size() - 1);
return true;
} else {
v.remove(v.size() - 1);
return false;
}
}
private int sum(Vector<Integer> v) {
int sum = 0;
for (int i = 0; i < v.size(); i++) {
sum += v.get(i);
}
return sum;
}
public static void main(String arg[]) {
new Que1();
}
}
③ 將自然數1至100按順時針圍成一圈,首先取出1,然後順時針方向按步長L=30取數(已取出的數不再參加計數),
這其實就是一個約瑟夫環問題,你網路一下就知道了
類似於已知100個人(以編號1,2,3...100分別表示)圍坐在一張圓桌周圍。從編號為1的人開始報數,數到30的那個人出列;他的下一個人又從1開始報數,數到30的那個人又出列;依此規律重復下去,直到圓桌周圍只剩下一個人,求這個人的編號。
數組實現
#include<iostream.h>
int main()
{
const int n=100;
int m=30;
int a[n];
for(int j=0;j<n;j++)
a[j]=j+1;
int k=1;
int i=-1;
while(1)
{
for(int j=0;j<m;)
{
i=(i+1)%n;
if(a[i]!=0)
j++;
}
if(k==n)
break;
a[i]=0;
k++;
}
cout<<a[i]<<endl;
return 0;
}
(用單向鏈表,雙向鏈表實現見我的空間)
④ 有2個人輪流取2n個數中的n個數,取數之和大者為勝。請編寫演算法,讓先取數者勝
先取者,每次取剩餘數最大的,後取者無論怎麼取,先取者所取數之和必大於後反者,必勝。
#include<stdio.h>
#define max 100
int main()
{
int i,j,a[max],left=0,right=0;
for(i=0;i<max;i++)
{
scanf("%d",&a[i]);
if(getchar()==' ') //輸入完成後直接按『ENTER』鍵就好,不要按空格後在按。換行符只能用' '來表示,'13'很讓人費解.
shu break;
}
if(i%2==1)
{
for(j=0;j<i;j=j+2)
left+=a[j];
for(j=1;j<i;j=j+2)
right+=a[j];
if(left>right)
printf("first left ");
else if(left<right)
printf("first right ");
else
printf("peace!");
}
else
printf("error!輸入的數字個數必須為偶數! ");
return 0;
}
(4)取數演算法題擴展閱讀:
{a.b}[a.b]的意義
{a.b}是指a.b的小數部分;[a.b]指a.b的整數部分,a.b={a.b}+[a.b]
若a.b ≧0,則{a.b}=0.b,[a.b]=a
若a.b ≦0,則{a.b}=1-0.b,[a.b]=a-1
axmodb+c=0
設xmodb=y轉化成ay+c=0求解。
axmodb+cxmodb+d=0
設xmodb=y轉化成ay+cy+d=0求解。