当前位置:首页 » 操作系统 » 取数算法题

取数算法题

发布时间: 2023-01-06 02:07:23

① 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求解。

热点内容
android停靠 发布:2025-05-11 08:42:23 浏览:644
超时代加密 发布:2025-05-11 08:41:29 浏览:779
为什么还要输入支取密码 发布:2025-05-11 08:32:24 浏览:362
数据库课程设计案例 发布:2025-05-11 08:15:33 浏览:51
为什么安卓不能通过蓝牙传东西 发布:2025-05-11 08:15:27 浏览:717
tomcat下载linux 发布:2025-05-11 07:47:06 浏览:792
phpcookie设置时间 发布:2025-05-11 07:36:15 浏览:111
固态硬盘需要缓存吗 发布:2025-05-11 07:29:09 浏览:606
松江换门密码锁哪里有 发布:2025-05-11 07:23:21 浏览:327
自动配置代理什么意思 发布:2025-05-11 07:16:51 浏览:994