c语言刷题

1012 字符串分类统计

#include 
#include 

int main(){
	char str[100];
	gets(str);
	char* s = strlwr(str);
	int letter = 0, number = 0, space = 0, other = 0;
	int n = 0;

	while(n<=strlen(str)){
		if(str[n] < 'z' && str[n] > 'a'){
			letter ++;
		}
		else if(str[n] = ' '){
			space ++;
		}
		else if(str[n] <= '9' && str[n] >= '0'){
			number ++;
		}
		else{
			other ++;
		}
	}
	printf("letter = %d", letter);
	printf("number = %d", number);
	printf("space = %d", space);
	printf("other = %d", other);
}

1.gets()输入一行字符串,可接收空格,数字,字母等字符。scanf()无法识别空格,getchar()只能接受一个字符串。
2.strlwr()是对字母统一从大写转换成小写。

1014 阶乘求和

1.利用递归;

int f(long long int n){
	if(n == 1){
		return 1;
	}
	else{
		return n * f(n -1);
	}
}//递归求每个项数
int main(){
	long long int sum = 0, n;
	long long int i = 1;
	scanf("%lld", &n);
	while(i <= n){
		sum += f(i);	
		i ++;
	}
	printf("%lld", sum);
}

2.for或while循环;

while(i <= n){
	ret *= i;
	sum += ret;
	i ++;
}

注意的地方是对于数据范围的考虑来定义数据类型,最开始我没有考虑,只是简单的统一为int类型,导致所能表示的数据范围较小,整道题的知识点对我来说就是数据类型的定义,还是需要理解每种数据类型所表示的范围。

1017 完数的判断

int main () {
    int N;
    scanf("%d", &N);
    int sum = 0;
    for (int i = 1; i <= N ; ++i) {
        sum = 0;
        for (int j = 1; j < i ; ++j) {
            if(i%j == 0&& j!=i){
                sum += j;
            }
        }
        if(sum == i){
            printf("%d\n",i);
        }
    }
}

1022 素数的查找

暴力查找,即双重for循环进行数字的遍历和能否被整除的判断,时间复杂度很高,后续学习复杂度低的算法。

int main () {
    int N, i = 2;
    int ret = 0;
    scanf("%d", &N);
    for (i = 2; i <= N; i++) {
        ret = 0;
        for (int j = 2; j < i ; j++) {
            if(i % j == 0){
                ret = 1;
                break;//检测到能整除,立刻break跳出循环进行对下一个数的判断。
            }

        }
        if(ret == 0){
            printf("%d",i);
        }
    }

1033 字符串的连接

首先想到了strcat()函数,函数声明如下:

char *strcat(char *dest, const char *src)
//函数的作用把src指向的字符串追加到dest的末尾。
//dest指向目标数组,要确保足够容纳追接的字符串。
//src指向要追加的字符串,该字符串不会覆盖目标字符串。
//最后返回一个指向目标数组dest的指针。
用法://使用时引入头文件string.h
strcat(str1, str2);

还有不使用strcat的方法,但是我觉得比较麻烦而且既然有现成的函数可以使用,就不需要大费周章再去选择更费时费力的方法。

1034 字符提取

涉及到数组指针的相关知识,数组在内存中是一段连续的空间,一定要明确大小和类型,因为该段连续的内存空间生成就固定了。而数组变量存放的是首元素的地址。如下就 str数组,该数组变量存放的即为首元素h的地址。因此可以将该地址赋予给一个指针变量来存放地址。

char str[] = "hello";
char* p = str;
//访问后面的元素
p + 1;//p+1为第二个元素的地址
p + 3;//第四个元素的地址,str[3]
printf("%d",*(p + 1));
printf("%d",*(p + 3));

那么指针变量也可以指向整个数组,但是需要加上取地址符号,虽然获取的数组地址依然为首元素地址但是意义并不相同。

char str = "hello";
char(* p)[5] = &str;
p //代表整个数组的地址
* p //解地址运算,获得首元素的地址而非首元素
* p + 3//获得第四位元素的地址,即为str[3]
printf("%d", *(*p + 3));

指针指向整个数组和指针指向首元素地址并非是同一件事情,而获取元素的方法也大相径庭。

你可能感兴趣的:(c语言)