Po 10 potędze wyświetlane liczby są nieprawidłowe – dlaczego?

0

Witam, jestem nowym programistom, który zaczyna dopiero swoją przygodę z językiem C. Mam polecenie do wykonania:

Napisz program, który wyświetla na ekranie wartości liczby 10 podniesionej do potęgi. Wartości wykładnika przyjmij od 0 do 19. W programie nie wolno używać gotowych funkcji do obliczania potęgi liczby 10. Nawiasy klamrowe, jak i funkcja printf mogą pojawić się tylko raz w kodzie.

Mianowicie zrobiłem kod. Ale po 10 potędze wszystko się wali liczby wariują i wyświetlają minus/plus i w ogóle nie są prawidłowe jaką zmienną użyć tutaj, by wszystko funkcjonowało. Wiem, że unsigned long long ma ogromny przedział, ale nie wiem jak go wprowadzić, później z %.. by wszystko działało.

3

Podpowiedz, nie musisz liczyc wartosci, tylko wypisac liczbe....

7

Masz błąd w 10 linii, a przynajmniej tak mi Szklana Kula podpowiada.

https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/

0

W tym problem, że mam zrobić ten program w pętli, tak to bym napisał i see ya. :)

#include <stdio.h>
int main (void)
{
	int suma;
	int a;
	suma=1;
	for(a=0;a<=19;a++)
	{
		if(a==0)
		{
			printf("0\n");
			continue;
		}else
		{
			suma*=10;
			printf("%d\n",suma);
		}
	}
	return 0;
}

i wartości jakie się wyświetlają:

0
100
1000
10000
100000
1000000
10000000
100000000
1000000000
1410065408
1215752192
-727379968
1316134912
276447232
-1530494976
1874919424
1569325056
-1486618624
-1981284352
1661992960

i funkcja printf jest o 1 raz za dużo ale mniejsza nie wiem czemu tak się dzieje bo ten język jest dla mnie obcy.

Mi tylko tu zależy by dowiedzieć się jak mogę opisać daną liczbę by działało bo resztę to już sobie poradzę :) Ale dopóki te liczby tak wariują przez zły typ zmiennej albo coś czego jeszcze nie wiem dopóty nic nie z tym nie zrobię :( Jak ktoś wie jak można naprawić tą rzecz to daję wielkie serducho <3

3
  1. 10 do potegi 0 to jest 1 a nie 0
  2. nie sluchasz, niepotrzebnie obliczasz potege, w zadaniu jest, ze masz wypisac, a nie obliczyc
  3. printf mial sie pojawic 1 raz w kodzie, a pojawil sie 2 razy
5

int suma; to nie jest unsigned long long (albo uint64_t).

Jak poprawisz, to musisz zmienić string formatujący printfa:

printf("%lld\n",suma);

Dodatkowo:

  • tak jak napisał @kaczus, nie ma potrzeby tego wyliczać, bo wystarczy dopisywanie kolejnych zer
  • for(a=0;a<=19;a++) wykona 20 iteracji, nie 19
1

Możesz coś takiego spróbować, zamiast potęgowania.

char b[21] = "1";
for (int i = 1; i<21; i++) {
	printf("%s\n", b);
	b[i]= '0';
}
0

@kaczus: Próbowałem zrobić jednak z wyliczaniem lecz, kompilator mojego kochanego wykładowcy odrzuca plik mimo zgodności. Niestety nie potrafią zrobić Twoją metodą z dostawianiem zer, gdyż na obecną chwilę wykracza to po za zasięg moich możliwości. Jeśli jesteś chętny mi zaprezentować to, zyskasz moją wdzięczność :)

<A przynajmniej nie opanowałem tego>

2

Napisz program, który wyświetla na ekranie wartości liczby 10 podniesionej do potęgi. Wartości wykładnika przyjmij od 0 do 19. W programie nie wolno używać gotowych funkcji do obliczania potęgi liczby 10. Nawiasy klamrowe, jak i funkcja printf mogą pojawić się tylko raz w kodzie.

Dobra, masz tu zadanie zgodnie z literą, niezgodnie z duchem:

#include <stdio.h>

int main()
{
    char arr[21] = ??< '1' ??>;
    int i;
    for(i = 1; i < 20; i++) ??<
        printf("%s\n", arr);
        arr[i] = '0';
    ??>
    return 0;
}

https://wandbox.org/permlink/NidFwHxqZ3nsZXQR

2


char b[20];
memset(b, '0', 19);   // memset masz z biblioteki string.h
for (int i = 0; i<=19; i++)
	printf("%d%s\n", 1, b+19-i);

	// wersja print żeby się upewnić co do ilości zer.
	//printf("10^%d %d%s\n", i, 1, b+19-i);

1

Może tak:

#include <stdio.h>

int main(void)
{
    char b[20] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
    int i = 0;
    for (i = 0; i < 20; i++)
        printf("%s\n", b,  b[i] = (i == 0 ? '1' : '0'));
    	
    return 0;
}
0

Śmiesznym jest fakt, że żadna wersja nawet 1 do 1 jakby była ale dopisane biblioteki nie przechodzą testów ;) Oczywiście tyle pomysłów ile informatyków a muszę się wpasować w kompilator zaprogramowany przez doktorantów z uczelni. Ale każdy kod przeanalizuje i postaram się wyciągnąć z niego wnioski :) Dziękuje każdemu kto próbował, i doceniam poświęcony czas :)

0

Spróbuj jeszcze ten :​>

#include <stdio.h>

int main()
{
    char arr[21] = <% '1' %>;
    int i;
    for(i = 1; i < 21; i++) <%
        printf("%s\n", arr);
        arr[i] = '0';
    %>
    return 0;
}

0

Tylko 2 sredniki:

char x[22] = "\2""1";
while (*x <= 21) (
    printf("%s\n", x + 1),
    x[(int) *x] = '0',
    (*x)++
);

@TheKryszczynPL - policz w petli i na koniec wypisz. To 19 sugeruje jakiego typu uzyc (zreszta juz masz w watku dokladnie napisane).

0
Defect summary;

Show	#	Defect ID
	1	arrayIndexOutOfBounds
	1	unreadVariable
2	total
Statistics
Line	Id	CWE	Severity	Message
4.6.c
9	unreadVariable	563	style	Variable 'arr' is assigned a value that is never used.
9	arrayIndexOutOfBounds	119	error	Array 'arr[21]' accessed at index 21, which is out of bounds.

@kq

0

Chyba najprostsze rozwiązanie:

#include <stdio.h>

int main(void) {
    char b[20] = "0000000000000000000";
    for (int i = 0; i < 20; i++)
        printf("1%s\n", b + 19 - i);
    return 0;
}
5

@Wibowit: nie zgodzę się:

int main() {
    for (int i = 0; i < 20; ++i) printf("1%.*d\n", i, 0);

    return 0;
}

Ideone

0

możesz użyć przecinków:

#include <stdio.h>

int main() 
{
	char buffer[22] = "1";
	
	for (int i = 1; i < 22; i++)
		printf("%d: %s\n", i - 1, buffer), buffer[i] = '0', buffer[i + 1] = '\0';
	
	return 0;
}
2

Zawsze można też trollować:

int main() {
puts("1");
puts("10");
puts("100");
puts("1000");
puts("10000");
puts("100000");
puts("1000000");
puts("10000000");
puts("100000000");
puts("1000000000");
puts("10000000000");
puts("100000000000");
puts("1000000000000");
puts("10000000000000");
puts("100000000000000");
puts("1000000000000000");
puts("10000000000000000");
puts("100000000000000000");
puts("1000000000000000000");
}

Kod pasuje do treści zadania.

3

Jeszcze można

int main()
{
printf("1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n1000000000\n10000000000\n100000000000\n1000000000000\n10000000000000\n100000000000000\n1000000000000000\n10000000000000000\n100000000000000000\n1000000000000000000");
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1