webForumDet fria alternativet

Hjälp med BigInteger

9 svar · 459 visningar · startad av kobranturre

kobranturreMedlem sedan maj 2004602 inlägg
#1

Jag försöker lära mig hu BigInteger används men det går helt fel

import java.math.BigInteger; 

public class Problem10{
	public static void main(String[] args){
	int c = 0;
	int d = 0;
	int e = 0;
	BigInteger f = new BigInteger("2");
		for (int a = 3; a < 1000000000; a++){
		e = 0;
			for (int b = 2; b < a; b++){
				if (a % b == 0){
				c = 1;
				}
				else{
				c = 0;
				}
				e += c;
				
			}
				if (e == 0){
					if (a < 1000000){
						f += a;
						System.out.println(f);
					}
				}
		}
	}
}
Mc FettoMedlem sedan nov. 20021 920 inlägg
#2

Hm, vet inte vad det är du vill göra men du kan inte lägga ihop en BigInteger med en int, du får konvertera/skapa en BigInteger av din int först. Sedan kan du addera dem.

kobranturreMedlem sedan maj 2004602 inlägg
#3

Grejen koden gör är att addera alla primtal under 1 000 000 med varandra.

Denna kod funkar inte:

import java.math.BigInteger; 

public class Problem10{
	public static void main(String[] args){
	int c = 0;
	int d = 0;
	int e = 0;
	BigInteger b = new BigInteger("2");
	BigInteger a = new BigInteger("3");
	BigInteger f = new BigInteger("2");
		for (; a < 1000000000; a++){
		e = 0;
			for (; b < a; b++){
				if (a % b == 0){
				c = 1;
				}
				else{
				c = 0;
				}
				e += c;
				
			}
				if (e == 0){
					if (a < 1000000){
						f += a;
						System.out.println(f);
					}
				}

		}
	}
}

Problem10.java:11: operator < cannot be applied to java.math.BigInteger,int
for (; a < 1000000000; a++){
........^
Problem10.java:11: operator ++ cannot be applied to java.math.BigInteger
for (; a < 1000000000; a++){
........................^
Problem10.java:13: operator < cannot be applied to java.math.BigInteger,java.math.BigInteger
for (; b < a; b++){
.........^
Problem10.java:13: operator ++ cannot be applied to java.math.BigInteger
for (; b < a; b++){
...............^
Problem10.java:14: operator % cannot be applied to java.math.BigInteger,java.math.BigInteger
if (a % b == 0){
......^
Problem10.java:24: operator < cannot be applied to java.math.BigInteger,int
if (a < 1000000){
......^
Problem10.java:25: operator + cannot be applied to java.math.BigInteger,java.math.BigInteger
f += a;
..^
7 errors

Mc FettoMedlem sedan nov. 20021 920 inlägg
#4

Nej, biginteger är ju inte samma sak som integer...
Men ifrån din första post där du försöker addera f och a, får du helt enkelt skapa en ny bigint med värdet av a. Sedan adderar du ihop dem med BigInteger.add()

kobranturreMedlem sedan maj 2004602 inlägg
#5

Har fått koden att funka som jag vill (tror jag). Jag skulle vilja effektivisera koden. Göra den snabbare och "normalare". Vad kan man ändra på den:

import java.math.BigInteger; 

public class Problem10{
	public static void main(String[] args){
	int c = 0;
	int d = 0;
	int e = 0;
	BigInteger i = new BigInteger("1");
	BigInteger f = new BigInteger("2");
	BigInteger h = new BigInteger("2");
			for (int a = 3; a < 1000000000; a++){
			h = h.add(i);
			e = 0;
				for (int b = 2; b < a; b++){
					if (a % b == 0){
					c = 1;
					}
					else{
					c = 0;
					}
				e += c;
				
				}
				if (e == 0){
					if (a < 1000000){
						f = f.add(h);
						System.out.println(f + "\t" + a);
					}
				}
		}
	}
}
Mc FettoMedlem sedan nov. 20021 920 inlägg
#6

du missar ett primtal... det första :)

kobranturreMedlem sedan maj 2004602 inlägg
#7

nepp ... Det är därför BigInteger f har startvärdet 2 (vilket är det första primtalet) ;)

Mc FettoMedlem sedan nov. 20021 920 inlägg
#8

jag har inte kollat din kod men, 2:an skrivs ivf inte ut (kanske den inte ska heller)?

kobranturreMedlem sedan maj 2004602 inlägg
#9

Den behöver inte skrivas ut. Jag antar att du säger så pga int a

Anledningen till att den skriver ut int a är pga att jag bara ville se hur lång tid det skulle ta och köra koden tills det att jag fått det sista värdet på f. Men min kod är slö och det gör att det tog ngn timme att komma upp i primtal som är runt 200000. Vilket betyder att det skulle ta massor med tid att vänta tills den kom upp i 1000000 (+ att jag märkte att den blev slöare). Thats why Im turning to wf. Skulle vilja snabba upp koden.

nitro2k01Medlem sedan aug. 20037 630 inlägg
#10

Problemet är att du inte kan använda de vanliga operatorerna(+-*/) på BigIntegers. Du måste använda metoderna add, multiply osv. (xxx = xxx.add(new BigInteger("5")); istället för xxx += 5; )
Mer info i Java's officiella dokumentation

Men annars förstår jag inte varför du ska använda en BigInteger alls? En long räcker bra, och kan lagra tal upp till 9 triljoner, så det borde inte vara något problem att använda long till alla variabler.

På tal om att optimera: Du kan byte ut

for (int b = 2; b < a; b++){

mot

for (int b = 2; b < Math.sqrt(a); b++){

eftersom ett tal inte kan ha någon divisor som är större än sin kvadratrot.

Genererad på 504 ms · cache AV · v20260730165559-full.f96bc7eb