Fragen zur grundlegenden Programmierung in der Sprache C (1)

Inhalt

1. Urteil Primzahl

2. Bestimmung von Schaltjahren

3. Größter gemeinsamer Teiler

4. Zählen Sie die Anzahl der 9er

5. Ergebnissummierung

6. Finden Sie den Maximalwert

7. Multiplikationsformeltabelle

8. String umgekehrte Reihenfolge (rekursive Implementierung)

9. Berechnen Sie die Summe jedes Bits einer Zahl (rekursive Implementierung)

10. Rekursive Realisierung von n hoch k

11. Array-Operationen

12. Tauschen Sie Arrays aus

13. Finden Sie die Anzahl der verschiedenen Bits in der Binärzahl zweier Zahlen

14. Drucken Sie ungerade und gerade Ziffern der Ganzzahl-Binärzahl

15. Berechnen Sie die Summe

16. Drucken Sie die Anzahl der Narzissen (erweiterte Version)

17. Drucken Sie die Raute

18. Probleme mit Soda

19. Passen Sie die Reihenfolge ungerade-gerade an

20. Strcpy-Simulationsimplementierung


1. Urteil Primzahl

Themeninhalt:

Um festzustellen, ob eine Zahl eine Primzahl ist, drucken Sie die Primzahlen zwischen 100 und 200 und berechnen Sie, wie viele Primzahlen es gibt.

#include <stdio.h>
#include <math.h>

//试除法
int main()
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 101; i <= 200; i+=2) //由于偶数一定不是素数 所以判断奇数即可
	{
		//sqrt是一个库函数,对i开平方 需要头文件<math.h>
		for (j = 2; j <= sqrt(i); j++) 
		{
			if (i % j == 0)
			{
				break;
			}
		}
		if (j > sqrt(i)) //上面循环有两种情况会退出:1:i % j == 0 2:j > sqrt(i) 情况2才能说明是素数
		{
			printf("%d ", i);
			count++;
		}
}
	printf("\n100--200共有:%d个素数\n", count);
	return 0;
}

Hinweis: Wenn i = a * b, dann muss einer der Faktoren (a oder b) kleiner oder gleich der Wurzel i sein 

Zum Beispiel: 16 = 2 * 8 also = 4 * 4, wobei sowohl 2 als auch 4 kleiner oder gleich dem Wurzelzeichen 16 sind

Also: Um zu beurteilen, ob es sich um eine Primzahl handelt (finde einen kleinen Faktor), braucht es nur den Wertebereich von j zwischen [ 2, sqrt(i)]

2. Bestimmung von Schaltjahren

Themeninhalt:

Schaltjahre zwischen 1000 und 2000 drucken.

#include <stdio.h>

int main()
{	
//判断闰年的规则:(满足1或2即可)
//1.能被4整除且不能被100整除
//2.能被400整除
	int year = 0;
	int count = 0;
	for (year = 1000; year <= 2000; year++)
	{
		if (((year % 4 == 0) && (year % 100 != 0)) || year % 400 == 0)
		{
			printf("%d ", year);
			count++;
		}
	}
	printf("\n共有%d个闰年",count);
	return 0;
}

3. Größter gemeinsamer Teiler

Themeninhalt:

Finden Sie bei zwei gegebenen Zahlen den größten gemeinsamen Teiler der beiden Zahlen

//辗转相除法
#include <stdio.h>

int main()
{	
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d %d", &a, &b);
	while (c = a % b)
	{
		a = b;
		b = c;
	}
	printf("最大公约数为:%d",b);
	return 0;
}

//暴力求解
#include <stdio.h>
//先找到两个数中的最小值min(因为最大公约数最大能到min)
//暴力解出最大公约数
int main()
{	
	int a = 0;
	int b = 0;
	int min = 0;
	int i = 0;

	scanf("%d %d", &a, &b);
	if (a > b)
		min = b;
	else
		min = a;
	for (i = min; i > 0; i--)
	{
		if ((a % i == 0) && (b % i == 0))
			break;
	}
	
	printf("最大公约数为:%d",i);
	return 0;
}

4. Zählen Sie die Anzahl der 9er

Themeninhalt:

Schreiben Sie ein Programm, um zu zählen, wie viele Zahlen 9 in allen ganzen Zahlen von 1 bis 100 vorkommen

#include <stdio.h>

int main()
{
	int i = 0;
	int count = 0;
	for (i = 1; i <= 100; i++)
	{
		if (i / 10 == 9)  //判断十位是否为9
			count++;
		if (i % 10 == 9)  //判断个位是否为9
			count++;
	}
	printf("\n1--100共有:%d个9\n", count);
	return 0;
}

5. Ergebnissummierung

Themeninhalt:

Berechnen Sie den Wert von 1/1-1/2+1/3-1/4+1/5 ... + 1/99 - 1/100 und drucken Sie das Ergebnis aus

//不用逻辑判断的代码
#include <stdio.h>

int main()
{
    int i = 0;
    double sum = 0.0;
    int flag = 1;
    for (i = 1; i <= 100; i++)
    {
         sum += flag * 1.0 / i;
         flag *= -1;
    }
    printf("%lf", sum);
}


//常规思路代码
#include <stdio.h>

int main()
{
    int i = 0;
    double sum = 0.0;
    for (i = 1; i <= 100; i++)
    {
        if (0 == i % 2)
        {
            sum -= 1.0 / i;
        }
        else
            sum += 1.0 / i;
    }
    printf("%lf", sum);
}

Hinweis: Der Divisionsoperator / Wenn beide Seiten ganze Zahlen sind, führt er eine ganzzahlige Division durch, wie z -Punktzahlen

6. Finden Sie den Maximalwert

Themeninhalt:

Finden Sie den größten Wert unter 10 ganzen Zahlen

#include <stdio.h>

int main()
{
    int arr[10] = { 0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i = 0;

    for(i = 0; i < sz; i++)
    {
        scanf("%d", &arr[i]);
    }
    int max = arr[0]; //易出错的一步
    for (i = 0; i < 10; i++)
    {
        if (arr[i] > max)
            max = arr[i];
    }
    printf("max = %d", max);
    return 0;
}

Hinweis: Wenn Sie den Maximalwert definieren, lassen Sie ihn gleich der ersten Zahl im Array sein, nicht 0 (um alle negativen Zahlen im Array zu verhindern).

7. Multiplikationsformeltabelle

Themeninhalt:

Geben Sie die 9*9-Multiplikationsformeltabelle auf dem Bildschirm aus

#include <stdio.h>

int main()
{
    int i = 0;
    //行数
    for (i = 1; i <= 9; i++)
    {
        int j = 0;
        //打印一行的多少列
        for (j = 1; j <= i; j++)
        {
            //打印一项
            printf("%d*%d = %-2d ", i, j, i * j);//如果不是%-2d会存在"错位"的现象
        }
        printf("\n");
    }

    return 0;
}

Achten Sie auf das Phänomen der „Fehlausrichtung“: Verwenden Sie zur Lösung %2d (rechtsbündig) oder %-2d (linksbündig).

8.  String umgekehrte Reihenfolge (rekursive Implementierung)

Themeninhalt:

Schreiben Sie eine Funktion reverse_string(char * string) (rekursive Implementierung)

Implementierung : Ordnen Sie die Zeichen in der Parameterzeichenfolge in umgekehrter Reihenfolge an, anstatt sie in umgekehrter Reihenfolge zu drucken.

zum Beispiel:

char arr[] = "abcdef"; der Inhalt des Arrays wird nach umgekehrter Reihenfolge zu: fedcba

Nehmen wir als Beispiel abcdef:

Rekursive Idee: Die Zeichen 'a' und 'f' an beiden Enden werden transponiert, und die verbleibende Zeichenfolge "bcde" in der Mitte nimmt an der nächsten Rekursion teil

Die spezifischen Schritte des ersten Schritts sind beispielsweise:

① TMP-Speicher 'a' erstellen

②'f' ersetzt die Position von 'a'

3 Ersetzen Sie die ursprüngliche Position von 'f' durch '\0' (der Zweck davon ist, die Position des vorletzten Elements e zu finden, da die Art und Weise, wie die Strlen-Funktion die Länge berechnet, darin besteht, auf die Beendigung von '\0' zu stoßen, damit die Mitte der umgekehrten Reihenfolge umgekehrt werden kann. restliche Saiten )

④ Wenn die mittlere Saite umgedreht ist, setzen Sie 'a' an die Stelle, an der früher 'f' war

Hinweis: Für die Schritte zum Umkehren des Zwischenstrings ist es, wenn die Länge des Zwischenstrings größer als 1 ist, notwendig, dass sie weiterhin Positionen ändern und an der nächsten Rekursion teilnehmen

//递归版本
#include <stdio.h>
#include <string.h>

void reverse_string(char arr[])
{
	char tmp = arr[0];         //①
	int len = strlen(arr);
	arr[0] = arr[len - 1];    //②
	arr[len - 1] = '\0';      //③
	//中间字符串的逆序
	if (strlen(arr + 1) > 1)  //注
		reverse_string(arr + 1);
	arr[len - 1] = tmp;       //④
}
int main()
{
	char arr[100] = { 0 };
	//scanf("%s", arr);//有问题,遇到空格时就终止了
	gets(arr);//读取一行,有空格也会读取
	reverse_string(arr);
	printf("%s", arr);
	return 0;
}


//非递归版本
#include <stdio.h>
#include <string.h>

void reverse_string(char arr[])
{
	int left = 0;
	int right = strlen(arr) - 1;
	
	while (left < right)
	{
		char tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}

}
int main()
{
	char arr[100] = { 0 };
	//scanf("%s", arr);
	gets(arr);
	reverse_string(arr);
	printf("%s", arr);
	return 0;
}

9. Berechnen Sie die Summe jedes Bits einer Zahl (rekursive Implementierung)

Themeninhalt:

Schreiben Sie eine rekursive Funktion DigitSum(n), die eine nicht negative ganze Zahl nimmt und die Summe der Zahlen zurückgibt, aus denen sie besteht

Beispielsweise sollte der Aufruf von DigitSum(1729) 1+7+2+9 zurückgeben, dessen Summe 19 ist

Eingabe: 1729, Ausgabe: 19

Rekursive Idee:

DigitSum(1719) ==> DigitSum(1719/10) + (1719%10)

#include <stdio.h>

int DigitSum(int n)
{
	if (n > 9)
		return DigitSum(n / 10) + n % 10;

	else		
	return n;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int sum = DigitSum(n);
	printf("%d", sum);
	return 0;
}

10. Rekursive Realisierung von n hoch k

Themeninhalt:

Schreiben Sie eine Funktion zur Implementierung von n hoch k unter Verwendung von Rekursion.

Rekursive Idee: n ^ k = n * (n ^ (k-1))

#include <stdio.h>

double Pow(int n, int k)
{
	if (k == 0)
		return 1.0;
	else if (k > 0)
		return (double)n * Pow(n, k - 1);
	else
		return 1.0 / Pow(n , -k);
}
int main()
{
	int n = 0;
	int k = 0;
	
	scanf("%d%d", &n,&k);
	double ret = Pow(n,k);
	printf("%lf", ret);
	return 0;
}

11. Array-Operationen

Themeninhalt:

Erstellen Sie ein Integer-Array und führen Sie die Operation für das Array aus

  1. Implementieren Sie die Funktion init(), um das Array vollständig auf Nullen zu initialisieren
  2. Implementieren Sie print(), um jedes Element des Arrays zu drucken
  3. Implementieren Sie die Funktion reverse(), um die Elemente eines Arrays zu invertieren.

Anforderung: Gestalten Sie die Parameter der obigen Funktionen selbst und geben Sie den Wert zurück.

#include <stdio.h>

void init(int *a, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		*(a + i) = 0;
	}
}

void print(int* a, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(a + i));
	}
	printf("\n");
}

void reverse(int* a, int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left < right)
	{
		int temp = a[left];
		a[left] = a[right];
		a[right] = temp;
		left++;
		right--;
	}
}


int main()
{
	int arr[5] = { 1, 2, 3, 4, 5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	init(arr,sz);
	print(arr,sz);
	int brr[5] = { 1, 2, 3, 4, 5 };
	reverse(brr,sz);
	print(brr, sz);
	return 0;
}

Hinweis: Versuchen Sie, beim Schreiben von Funktionen keine redundanten Operationen zu haben (z. B.: Initialisierungsfunktion, initialisieren Sie sie einfach, müssen Sie sie nicht ausdrucken). Außerdem erfordert das Umkehren eines Arrays das Umkehren der Array-Elemente, anstatt sie nur in umgekehrter Reihenfolge zu drucken.

12. Tauschen Sie Arrays aus

Themeninhalt:

Tauschen Sie den Inhalt von Array A mit dem Inhalt von Array B aus. (die gleiche Größe wie das Array)

#include <stdio.h>

void SwapArr(int* arr1, int* arr2, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		int temp = arr1[i];
		arr1[i] = arr2[i];
		arr2[i] = temp;
	}
}

int main()
{
	int arr1[] = { 1, 3, 5, 7, 9 };
	int arr2[] = { 2, 4, 6, 8, 0 };
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	SwapArr(arr1, arr2, sz);
    return 0;
}

13. Finden Sie die Anzahl der verschiedenen Bits in der Binärzahl zweier Zahlen

Themeninhalt:

Programmierimplementierung: Wie viele Bits unterscheiden sich in der binären Darstellung zweier int (32-Bit) Ganzzahlen m und n? 

Eingabebeispiel:

1999 2299

Beispielausgabe: 7

#include <stdio.h>


//方法一:
int get_diff_bit1(int m, int n)
{
	//一个数与1按位与,可知从右往左第一位是0还是1
	//eg:11 - 十进制
	//00000000000000000000000000001011 - 二进制
	//00000000000000000000000000000001 - 和1按位与 结果为1,若最右是0,则结果为1
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
		if (((m >> i) & 1) != ((n >> i) & 1))
			count++;
	}
	return count;
}


//方法二:
//要求m与n之间有多少位不同,就相当于求 m^n后二进制序列里有多少个1(因为异或相同为0相异为1)
//又已知a & (a - 1)可以使a从左往右第一个1变成0,所以代码如下:
int get_diff_bit2(int m, int n)
{
	int i = 0;
	int count = 0;
	int tmp = m ^ n;
	while (tmp)
	{
		tmp = tmp & (tmp - 1);
		count++;
	}
	return count;
}

int main()
{
	int m = 0;
	int n = 0;
	scanf("%d%d", &m, &n);
	
	int count = get_diff_bit2(m, n);

	printf("%d\n", count);
}

14. Drucken Sie ungerade und gerade Ziffern der Ganzzahl-Binärzahl

Themeninhalt:

Holen Sie sich alle geraden und ungeraden Bits in einer ganzzahligen Binärfolge und drucken Sie die Binärfolge entsprechend aus

#include <stdio.h>

int main()
{
	int m = 0;
	scanf("%d", &m);
	//eg:11
	//00000000000000000000000000001011

	//偶数位
	int i = 0;
	for (i = 31; i >= 1; i -= 2)
	{
		printf("%d ", (m >> i) & 1);
	}
	printf("\n");
	//奇数位
	for (i = 30; i >= 0; i -= 2)
	{
		printf("%d ", (m >> i) & 1);
	}
	return 0;
}

15. Berechnen Sie die Summe

Themeninhalt:

Finde die Summe der ersten 5 Terme von Sn=a+aa+aaa+aaaa+aaaaa, wobei a eine Zahl ist,

Zum Beispiel: 2+22+222+2222+22222

#include <stdio.h>

int main()
{
	int a = 0;
	int n = 0;
	int i = 0;
	scanf("%d%d", &a, &n);
	int b = 0;
	int sum = 0;

	for (i = 0; i < n; i++)
	{
		b = b * 10 + a;
		sum += b;

	}
	printf("%d\n", sum);
	
	return 0;
}

16. Drucken Sie die Anzahl der Narzissen (erweiterte Version)

Themeninhalt:

Alle "Narzissen" zwischen 0 und 100000 finden und ausgeben.

"Narzissenzahl" bezieht sich auf eine n-stellige Zahl, und die Summe der n-ten Potenz jeder Zahl ist tatsächlich gleich der Zahl selbst, wie zum Beispiel: 153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3, dann ist 153 eine "Narzissenzahl".

int main()
{
	int i = 0;

	for (i = 0; i <= 100000; i++)
	{
		//判断i是否为自幂数
		//1. 计算i的位数 - n
		int tmp = i;
		int count = 1;
		int sum = 0; //*易错点*,每次循环开始时sum要归0,不能写在循环外面
		while (tmp /= 10)
		{
			count++;
		}
		//2.获得i的每一位,计算其每一位的n次方和
		tmp = i;
		while (tmp)
		{
			sum += pow(tmp % 10, count);//pow为求幂的库函数,需要头文件math.h
			tmp /= 10;
		}
		//3.比较并打印
		if (i == sum)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

17. Drucken Sie die Raute

Themeninhalt:

Geben Sie eine Raute auf dem Bildschirm in C-Sprache aus.

#include <stdio.h>

int main()
{
	//打印一个菱形
	int line = 0; //行数
	int i = 0;

	scanf("%d", &line); //假设为6
	//菱形上半部分打印line行
	for (i = 0; i < line; i++)
	{
		//打印一行
		//先打印空格,再打印* 
		//第一行打印line - 1个空格,第二行line - 2个空格...
		int j = 0;
		for (j = 0; j < (line - 1 - i); j++)
		{
			printf(" ");
		}
		for (j = 0; j < (2 * i + 1); j++)
		{
			printf("*");
		}
		printf("\n");
	}
	//下半部分打印line - 1行
	for (i = 0; i < line - 1; i++)
	{
		 //打印一行
		//先打印空格,再打印*
		int j = 0;
		for (j = 0; j < i + 1; j++)
		{
			printf(" ");
		}
		for (j = 0; j <(line - 1 - i) * 2 - 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

18. Probleme mit Soda

Themeninhalt:

Trinken Sie Soda, 1 Flasche Soda ist 1 Yuan, 2 leere Flaschen können gegen eine Flasche Soda eingetauscht werden, geben Sie 20 Yuan, wie viel Soda sein kann (programmiert).

#include <stdio.h>

int main()
{
	int money = 0;
	int total = 0;  //总共换了多少瓶汽水
	int empty = 0;  //现在手里有多少空瓶

	scanf("%d", &money); //20
	total += money; //用钱买汽水
	empty = money;  //由汽水变空瓶

	while (empty >= 2)
	{
		total += empty / 2;//空瓶换来的汽水
		empty = empty / 2 + empty % 2;//*盘点手里的空瓶数
	}
	printf("total = %d\n", total);
	
	return 0;
}

19. Passen Sie die Reihenfolge ungerade-gerade an

Themeninhalt:

Nehmen Sie ein Array von Ganzzahlen und implementieren Sie eine Funktion, um die Reihenfolge der Zahlen im Array so anzupassen, dass alle ungeraden Zahlen im Array in der ersten Hälfte des Arrays und alle geraden Zahlen in der zweiten Hälfte des Arrays stehen.

Idee: Doppelzeiger: Finde eine gerade Zahl von vorne nach hinten im Array, finde eine ungerade Zahl von hinten nach vorne, vertausche und bewege den Zeiger in die Mitte

#include <stdio.h>

//简单的版本
void move_arr1(int *arr, int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left < right)
	{
		if (arr[left] % 2 == 0)
		{
			if (arr[right] % 2 == 1)
			{
				int tmp = arr[left];
				arr[left] = arr[right];
				arr[right] = tmp;
			}
			else
			{
				right--;
			}
		}
		else
		{
			left++;
		}
	}
}

//更易理解的版本,但更复杂
//该方法要单独考虑数组全为奇数或全为偶数的情况:
//若全是奇数,left会一直++,出现越界的情况

void move_arr2(int* arr, int sz)
{
	int left = 0;
	int right = sz - 1;
	
	while (left < right)
	{
		//从左边找一个偶数
		while ((left < right) && arr[left] % 2 == 1)
		{
			left++;
		}
		//从右边找一个奇数
		while ((left < right) && arr[right] % 2 == 0)
		{
			right--; 
		}
		if (left < right)
		{
			int tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
		}
	}
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	move_arr1(arr , sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(arr + i));//验证
	}
	return 0;
}

20. Strcpy-Simulationsimplementierung

Themeninhalt:

Simulieren Sie die Bibliotheksfunktion strcpy

#include<stdio.h>
#include<assert.h>

char* my_strcpy(char* dest, const char* src) 
                //const为了保证拷贝的数组不发生变化,防止输错了的时候改变了原数组的值
{
	assert(dest && src); //assert:断言(当dest或src为空时,会报错),需要头文件<assert.h>                    
	char* ret = dest;
	while (*dest++ = *src++)
	{
		; //一举两得,既将arr1赋值了hello\0,且赋值\0后,循环条件判定为假,终止循环
	}
	return ret;
}

//简化前的代码
void my_strcpy2(char* dest, char* src)
{
	assert(dest != NULL);//断言
	assert(src != NULL);//断言
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;//处理'\0'
}

int main()
{
	char arr1[20] = "xxxxxxxxxxxxx";
	char arr2[] = "hello";
    my_strcpy(arr1, arr2);
	printf("%s", arr1);
	printf("%s\n",my_strcpy(arr1, arr2));
	return 0;
}

Ich denke du magst

Origin blog.csdn.net/m0_62934529/article/details/123215709
Empfohlen
Rangfolge