C语言指针的作业

2023-10-16 15:54:48 浏览数 (1)

指针的作业

  1. 求Sn = a aa aaa aaaa aaaaa的前五项和,其中a是一个数字。

例如:2 22 222 2222 22222

代码语言:javascript复制
/*
求Sn = a   aa   aaa   aaaa   aaaaa的前五项和,其中a是一个数字。

例如:2   22   222   2222   22222
*/
#include <stdio.h>
int main(){
	//由a组成前n项之和 - 不考虑溢出
	int a = 0;
	int n = 0;
	scanf("%d %d",&a,&n);
	int i = 0;
	int sum = 0;
	int ret = 0;
	for(i = 0;i < n;i  ){
		ret = ret * 10   a;
		sum = sum   ret;
	}
	printf("%dn",sum);
	return 0;
}
  1. 写一个函数打印arr数组的内容,不使用数组下标,使用指针。

arr是一个整型一维数组。

代码语言:javascript复制
/*
写一个函数打印arr数组的内容,不使用数组下标,使用指针。
arr是一个整型一维数组。
*/
#include <stdio.h>
int main(){
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int * p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for(i = 0;i < sz;i  ){
		printf("%d ",*(p i));
	}
	return 0;
}
  1. 求出0~100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数,其各位数字的n次方之和正好等于该数本身。 例如:153 = 1^3 5^3 3^3 ,则153是一个“水仙花数”。
代码语言:javascript复制
/*
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和正好等于该数本身。
例如:153 = 1^3   5^3   3^3 ,则153是一个“水仙花数”。
*/
#include <stdio.h>
#include <math.h>
int main(){
	int i = 0;
	for(i = 0;i <= 100000;i  ){
		//判断i是否会自幂数
		int n = 1;//计算位数
		int tmp = i;
		while(i / 10){
			n  ;
			tmp  = tmp / 10;
		}
		//计算i的每一位的n次方之和
		tmp = i;
		int sum = 0;
		while(tmp){
			//pow是用来求次方的
			sum = sum   pow(tmp % 10,n) ;
			tmp = tmp / 10;
		}
		//判断
		if(sum == i){
			printf("%d ",i);
		}
	}
	return 0;
}
  1. ​ 写一个函数,逆序字符串内容
代码语言:javascript复制
/*
写一个函数,逆序字符串内容
*/
#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char* str){
	assert(str);
	int len = strlen(str);
	char* left = str;
	char* right = str   len -1;
	while(left < right){
		char tmp = *left;
		*left = * right;
		*right = tmp;
		left  ;
		right--;
	}
}
int main(){
	char arr[] = "abcdef";
	reverse(arr);
	printf("%s",arr);
	return 0;
}
  1. 打印杨辉三角
代码语言:javascript复制
/*
打印杨辉三角
*/
#include <stdio.h>
#include <string.h>
#include <assert.h>

int main(){
	int arr[10][10] = {0};
	int i = 0;
	int j = 0;
	for(i = 0;i < 10;i  ){
		for(j = 0;j < 10;j  ){
			if(j == 0){
				arr[i][j] = 1;
			}
			if(i == j){
				arr[i][j] = 1;
			}
			if(i >= 2 && j >= 1){
				arr[i][j] = arr[i-1][j-1]   arr[i-1][j];
			}
		}
	}
	for(i = 0;i < 10;i  ){
		for(j = 0;j <=i;j  ){
			printf("%d",arr[i][j]);
		}
		printf("n");
	}
	return 0;
}
  1. 猜凶手

日本某地发生了一件谋杀案,警察通过排查确定查人凶手为4个嫌疑犯的一个。

以下为4个嫌疑犯的供词:

A:不是我。

B:是C

C:是D

D:C在胡说

已知三个人说了真话,一个人说的是假话。

请根据这些信息,写一个程序来确定到底谁是凶手。

代码语言:javascript复制
#include <stdio.h>
int main(){
	int killer = 0;
	for(killer = 'A';killer <= 'D';killer  ){
		if((killer != 'A')   (killer == 'C')   (killer == 'D')   (killer != 'D') == 3){
			printf("%cn",killer);
		}
	}
	return 0;
}
  1. 猜名次

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:

A:B第二,我第三

B:我第二,E第四

C:我第一,D第二

D:C最后,我第三

E:我第四,A第一

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

代码语言:javascript复制
#include <stdio.h>
int main(){
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	int e = 0;
	for(a = 1;a <= 5;a  ){
		for(b = 1;b <= 5;b  ){
			for(c = 1;c <= 5;c  ){
				for(d = 1;d <= 5;d  ){
					for(e = 1;e <= 5;e  ){
						if(((b == 2)   (a == 3) == 1)
							&& ((b == 2)   (e == 4) == 1)
							&& ((c == 1)   (d == 2) == 1)
							&& ((c == 5)   (d == 3) == 1)
							&& ((e == 4)   (a == 1) == 1)
						){
							if(a*b*c*d*e == 120){
								printf("a=%d,b=%d,c=%d,d=%d,e=%dn",a,b,c,d,e);
							}
						}
					}
				}
			}
		}
	}
	return 0;
}
代码语言:javascript复制
int a[3][4] = {0};
printf("%dn",sizeof(a));// 48 = 3*4*sizeof(int)
printf("%dn",sizeof(a[0][0]));//4 - a[0][0]
printf("%dn",sizeof(a[0]));//16
printf("%dn",sizeof(a[0] 1));//4 解释:a[0]作为数组名并没有单独放在sizeof内部,也没有取地址,所以a[0]就是第一行第一个元素的地址。a[0] 1 就是第一行第二个元素的地址
printf("%dn",sizeof(*(a[0] 1)));//4 *(a[0] 1)是第一行第二个元素
printf("%dn",sizeof(a 1));
/*
a是二维数组的数组名,并没有取地址,也没有单独存放在sizeof内部,所以a表示二维数组首元素的地址,即:第一行的地址,a 1就是二维数组第二行的地址
*/
printf("%dn",sizeof(*(a 1)));//16 a 1市第二行的地址,所以解引用后表示第二行的大小就是16
printf("%dn",sizeof(&a[0] 1));//4  a[0]是第一行的数组名,&a[0]是第一行的地址,&a[0] 1就是第二行的地址
printf("%dn",sizeof(*(&a[0] 1)));//16 &a[0] 1就是第二行的地址,解引用后就是第二行,所以计算第二行的大小
printf("%dn",sizeof(*a));//16 第一行的大小 等价a[0]
/*
a作为二维数组的数组名,没有&,没有单独放到sizeof内部,a就是首元素的地址即第一行的地址,所以解引用就是第一行的大小
*/
printf("%dn",sizeof(a[3]));//16 sizeof内部的表达式不计算 所以判断的是类型 所以其实不存在也能够通过类型计算
代码语言:javascript复制
#include <stdio.h>
int main()
{
    char *a[] = {"work","at","alibaba"};
    char**pa = a;
    pa  ;
    printf("%sn", *pa);
    return 0;
}
代码语言:javascript复制
int main()
{
    char *c[] = {"ENTER","NEW","POINT","FIRST"};
    char**cp[] = {c 3,c 2,c 1,c};
    char***cpp = cp;
    printf("%sn", **  cpp);
    printf("%sn", *--*  cpp 3);
    printf("%sn", *cpp[-2] 3);
    printf("%sn", cpp[-1][-1] 1);
    return 0;
}

杨氏矩阵:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找一个数字是否存在。要求:时间复杂度小于O(N)。

代码语言:javascript复制
#include <stdio.h>
int findNum(int arr[3][3],int* px,int* py,int k ){
	int x = 0;
	int y = *py-1;
	while(x < *px && y >= 0){
		if(arr[x][y] < k){
			x  ;
		} else if(arr[x][y] > k){
			y--;
		}else{
			*px = x;
			*py = y;
			return 1;
		}
	}
	return 0;
}
int main(){
	int arr[3][3] = {1,2,3,4,5,6,7,8,9};
	int k = 7;
	int x = 3;
	int y = 3;
	int ret = findNum(arr,&x,&y,k);
	if(ret == 1){
		printf("找到了n");
		printf("坐标为:%d,%dn",x,y);
	}else if(ret != 1){
		printf("没找到n");
	}
	return 0;
}

字符串左旋

实现一个函数,可以左旋字符串中的k个字符。

例如:ABCD左旋一个字符可以得到BCDA

ABCD左旋两个字符可以得到CDAB

代码语言:javascript复制
#include <stdio.h>
#include <string.h>
void LeftMove(char* str,int k){
	int i = 0;
	int n = strlen(str);
	for(i = 0;i < k;i  ){
		//每次左旋转一个字符
		char tmp = *str;
		//后面的n-1个字符
		int j = 0;
		for(j = 0;j < n-1;j  ){
			*(str   j) = *(str   j  1);
		}
		//tmp放在最后
		*(str   n - 1) = tmp;
	}
}
int main(){
	char arr[10] = "ABCDEF";
	int k = 2;
	LeftMove(arr,k);
	printf("%sn",arr);
	return 0;
}

另一种方法,三步翻转法

代码语言:javascript复制
#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char *left,char *right){
	assert(left);
	assert(right);
	while(left < right){
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left  ;
		right--;
	}
}
void LeftMove(char* str,int k){
	assert(str);
	int n = strlen(str);
	//左
	reverse(str,str k-1);
	//右
	reverse(str k,str n-1);
	//整体
	reverse(str,str n-1);
}
int main(){
	char arr[10] = "ABCDEF";
	int k = 2;
	LeftMove(arr,k);
	printf("%sn",arr);
	return 0;
}

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1=AABCD,s2=BCDAA返回1

给定s1=ABCD,s2=ACBD,返回0

代码语言:javascript复制
#include <stdio.h>
#include <string.h>
#include <assert.h>
int IsStringRotate(char *str1,char *str2){
	int i = 0;
	int n = strlen(str1);
	for(i = 0;i < n;i  ){
		//每次左旋转一个字符
		char tmp = *str1;
		//后面的n-1个字符
		int j = 0;
		for(j = 0;j < n-1;j  ){
			*(str1   j) = *(str1   j  1);
		}
		//tmp放在最后
		*(str1   n - 1) = tmp;
		if(strcmp(str1,str2) == 0){
			return 1;
		}
	}
	return 0;
}
int main(){
	/*
	  AABCD左旋一个字符:ABCDA
	  AABCD左旋两个字符:BCDAA
	  AABCD右旋一个字符:DAABC
	*/
	char arr1[] = "AABCD";
	char arr2[] = "BCDAA";
	int ret = IsStringRotate(arr1,arr2);
	if(ret == 1){
		printf("yesn");
	}else{
		printf("non");
	}
	return 0;
}

另一种方法:

代码语言:javascript复制
#include <stdio.h>
#include <string.h>
#include <assert.h>
int IsStringRotate(char *str1,char *str2){
	//长度不相等肯定不是旋转得到的
	if(strlen(str1) != (strlen(str2))){
		return 0;
	}
	//1.str1字符串后面追加一个str1
	//AABCDAABCD
	int len = strlen(str1);
	strncat(str1,str1,len);
	//2.判断str2是否为str1的子串
	char *ret = strstr(str1,str2);
	if(ret == NULL){
		return 0;
	}else{
		return 1;
	}
}
int main(){
	/*
	  AABCD左旋一个字符:ABCDA
	  AABCD左旋两个字符:BCDAA
	  AABCD右旋一个字符:DAABC
	*/
	char arr1[20] = "AABCD";
	char arr2[] = "BCDAA";
	int ret = IsStringRotate(arr1,arr2);
	if(ret == 1){
		printf("yesn");
	}else{
		printf("non");
	}
	return 0;
}
 

0 人点赞