哈工大C语言程序设计精髓MOOC 第十四周编程题

第14周——结构设计的艺术

练兵区——编程题——不计入总分

1 略

2字符串中的字符排序(4分)

题目内容:
编写一个函数,对一个字符串中的字符进行升序排序,并输出字符排序后的字符串,字符串长度小于20。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 20

void sortString(char *str);
void swap(char *str, int i, int j);

int main(void) {
	char str[N];
	printf("Input a string:\n");
	gets(str);

	sortString(str);
	printf("%s", str);

	return 0;
}


void sortString(char *str) {
	int len = strlen(str);
	for(int i = len - 1; i > 0; i--) {
		for(int j = 0; j < i; j++) {
			if(*(str + j) > *(str + j + 1)) {
				swap(str, j, j+1);
			}
		}
	}
}

void swap(char *str, int i, int j) {
	char temp = *(str + i);
	*(str + i) = *(str + j);
	*(str + j) = temp;
}

3纯数字字符串检验(4分)

题目内容:
按给定函数原型编程检查一个字符串是否全由数字组成。
int IsAllDigit(char p[]);/*若全由数字组成,则函数返回1,否则返回0*/
在主函数中,从键盘输入一个字符串(假设字符串的最大长度为20个字符),调用函数IsAllDigit(),检查该字符串是否全由数字组成,然后在主函数中根据函数IsAllDigit()的返回值输出相应的提示信息。

#include<stdio.h>
#include<string.h>
#define STR_LEN 20

int IsAllDigit(char p[]);

int main(){
	char str[STR_LEN];
	printf("Please input a string:\n");
	gets(str);
	
	int res = IsAllDigit(str);
	
	if(res == 0) printf("The string is digit string.");
	else if(res == -1) printf("The string is not digit string.");
	return 0;
}

int IsAllDigit(char p[]){
	while(*p){
		if(*p > '9'||*p < '0'){
			return -1;
		}
		p++;
	}
	return 0;
}

4孪生素数(4分)

题目内容:
相差为2的两个素数称为孪生素数。例如,3与5,41与43等都是孪生素数。设计程序求出指定区间上的所有孪生素数对。区间上限和下限由键盘获取。

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

void findIsPrinme(long start, long end);
int isPrime(long num);

int main() {
	long start, end;
	printf("please input c,d(c>2):\n");
	scanf("%ld,%ld", &start, &end);
	
	findIsPrinme(start, end);
	return 0;
}

void findIsPrinme(long start, long end){
	long frontPrime = -1;
	long count = 0;
	for(long i = start; i <= end; i++){
		if(isPrime(i) == 0){
			if(frontPrime > 1&& i - frontPrime == 2){
				printf("(%ld,%ld)\n", frontPrime, i);
				count++; 
			}
			frontPrime = i;
			
		}
	}
	
	printf("total=%d\n", count);
}

int isPrime(long num){
	// -1 no 0 yes
	if(num==1) return -1;
	long max = sqrt(num);
	
	for(long i = 2; i <= max; i++){
		if(num % i == 0){
			return -1;
		}
	}
	return 0;
}

5求解不等式(4分)

题目内容:
对指定正实数n(采用双精度浮点型表示),试求满足下面平方根不等式的最小整数m,并输出不等式左边的值。程序中浮点数的数据类型均为double。

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

double findMinM(double n, int *res);
double getSum(int m,int hasSum);

int main(){
	double n;
	int m;
	printf("Input n:\n");
	scanf("%lf", &n);
	
	double res = findMinM(n, &m);
	printf("Result:m>=%d\n", m);
	printf("s=%.2f\n", res);
	
	return 0;
}

double findMinM(double n, int *res){
	*res = 0;
	double sum = 0;
	
	while(sum <= n){
		sum = getSum(*res, 0);
		(*res)++;
	}
	(*res)--;
	return sum;
}

double getSum(int m, int hasSum){
	if(m < hasSum){
		return 0;
	}
	
	return sqrt(m + hasSum) + getSum(m, hasSum + 1);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值