编程练习——程序设计入门-C语言

week-1

1.1 逆序的三位数

程序每次读入一个正三位数,然后输出逆序的数字。注意,当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
简单一点

#include <stdio.h>

int main(){
	int a;
	scanf("%d", &a);
	int x100 = a/100;
	int x10 = (a-x100*100)/10;
	int x = a - x100*100 - x10*10;
	printf("%d", x*100+x10*10+x100);
	return 0;
}

复杂一点:需要考虑到百位十位为零的情况

#include <stdio.h>

int main(){
	int a;
	scanf("%d", &a);
	int x100 = a/100;
	int x10 = (a-x100*100)/10;
	int x = a - x100*100 - x10*10;
	if(x) printf("%d%d%d", x,x10,x100);
	else{
		if(x10) printf("%d%d", x10,x100);
		else{
			printf("%d", x100);
		}
	}
	return 0;
}

week-2

2.1 时间转换

UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。现在,你的程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果分小于10分,需要保留十位上的0。如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分。

#include <stdio.h>

int main(){
	int a;
	scanf("%d", &a);
	int h1 = a / 100;
	int min = a % 100;
	int h2;
	if (h1>8){
		h2 = h1 - 8;
	}
	else h2 = h1 - 8 + 24;
	printf("%d", h2*100+min);
	return 0;
}

2.2 翻译

#include <stdio.h>

int main(){
	int RS;
	scanf("%d", &RS);
	int R = RS/10, S = RS%10;
	switch(S){
		case 1:
            printf("Faint signals, barely perceptible, ");
            break;
        case 2:
            printf("Very weak signals, ");
            break;
        case 3:
            printf("Weak signals, ");
            break;
        case 4:
            printf("Fair signals, ");
            break;
        case 5:
            printf("Fairly good signals, ");
            break;
        case 6:
            printf("Good signals, ");
            break;
        case 7:
            printf("Moderately strong signals, ");
            break;
        case 8:
            printf("Strong signals, ");
            break;
        case 9:
            printf("Extremely strong signals, ");
            break;
	}
	switch(R){
		case 1:
            printf("unreadable.");
            break;
        case 2:
            printf("barely readable, occasional words distinguishable.");
            break;
        case 3:
            printf("readable with considerable difficulty.");
            break;
        case 4:
            printf("readable with practically no difficulty.");
            break;
        case 5:
            printf("perfectly readable.");
            break;
	}
	return 0;
}

week3

3. 1 统计奇数、偶数个数

你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。

#include <stdio.h>

int main(){
	int a;
	scanf("%d", &a);
	int odd = 0;
	int even = 0;
	while(a != -1) {
		if (a%2 != 0) odd++;
		else even++;
		scanf("%d", &a);
	}
	printf("%d %d", odd, even);
	return 0;
}

3.2 数字特征值

对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。

你的程序要读入一个非负整数,整数的范围是[0,1000000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。

提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。

#include <stdio.h>

int main(){
	int a; // 输入整数 
	scanf("%d", &a);
	int n = 0; // 位数
	int x; //位数上的数字
	int b = 1; // 解决求幂的类型不同 
	int number = 0; // 返回的数字 
	while (a != 0){
		n++;
		x = a % 10;
		if((x%2) == (n%2)){
			number += b;
		}
		a /= 10;
		b *= 2;
	} 
	printf("%d", number);
	return 0;
}

week - 4

4.1 素数之间的和

我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。现在,给定两个整数n和m,$0<=m<=200$,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。

#include <stdio.h>

int main(){
	int n, m; 
	scanf("%d %d", &n, &m); // 输入n m
	int i=1; // 素数个数
	int j;
	int exist; // 判断是不是素数 
	int x=2;
	// 前n-1个素数
	while (i<n) {
		x++;
		exist = 1;
		for (j=2; j<x; j++) {
			if (x%j == 0) {
				exist = 0;
				break;
			}
		}
		i += exist;
		// printf("x=%d exist=%d i=%d\n", x, exist,i);
	}
	// n ~ m个素数
	int sum = x; 
	while (i<m) {
		exist = 1;
		x++;
		for (j=2; j<x; j++) {
			if (x%j == 0) {
				exist = 0;
				break;
			}
		}
		i += exist;
		sum += exist*x;
	}
	printf("%d", sum);
	return 0;
}

week - 5

5.1 数分解成素数相乘

#include <stdio.h>

int main(){
	int a;
	scanf("%d", &a); // 输入整数
	int j;
	while (a>1) {
		for (j=2; j<=a; j++){
			if (a%j == 0){
				printf("%d", j);
				a /= j;
				if (a>1) {
					printf("*");
					break;
				}
			}
		}
	} 
	return 0;
}

5.2 输出两数之间的完数

#include <stdio.h>


// 判断整数是否为完数 ,是返回1,不是返回0 
int wanshu(int x) {
	int sum = 0;
	int i;
	for (i=1;i<x;i++){
		if (x%i == 0){
			sum += i;
		}
	}
	if (sum == x) return 1;
	else return 0;
}


int main(){
	int n,m;
	scanf("%d %d", &n, &m); // 输入 n 和 m 
	int a; //a用来返回是否为完数
	int sum = 0;
	while (n<=m) {
		a = wanshu(n); // 此刻的整数是否为完数
		if (a == 1){
			if (sum > 0){
				printf(" ");
			} // 判断是否要输出空格 
			sum += a;
			printf("%d", n); 
		} // 输出完数
		n++; 
	} 
	if (sum==0) printf("                             "); //如果没有完数输出一行空格
	return 0;
}

week - 6

6.1 两个多项式的和

#include <stdio.h>


int main(){
	int A1[101] = {0};
	int A2[101] = {0};
	int m,a;
	
	do {
		scanf("%d %d", &m, &a);
		A1[m] = a;
	} while(m!=0); // 输入第一个数组 
	
	do {
		scanf("%d %d", &m, &a);
		A2[m] = a;
	} while(m!=0); // 输入第二个数组 
	
	// 两个多项式相加
	int i;
	int A;
	int sum = 0;
	for ( i=100;i>0;i-- ) {
		A = A1[i] + A2[i];
		if ( A!=0 ) {
			if ((sum!=0) && (A>0)) printf("+");
			// if ((sum!=0) && (A<0)) printf("-"); // <0自然会输入符号,多余 
			printf("%dx%d", A, i);
			sum = 1;
			//printf("\n%d", sum);
		}
	} // 输出指数>0的系数不等于0 
	if ( A1[0]+A2[0] != 0) {
		//printf("\n%d", sum);
		if ((sum!=0) && (A1[0]+A2[0]>0)) printf("+");
		// if ((sum!=0) && (A1[0]+A2[0]<0)) printf("-");
		printf("%d", A1[0]+A2[0]);
	}
	return 0;
}

6.2 鞍点判断

#include <stdio.h>
#include <string.h>/* memset */

int main(){
	int n;
	scanf("%d", &n); // 输入方阵维度 
	int A[n][n]; // 存放矩阵
	int i,j; // 矩阵下标 
	int exist = 0; // 有没有鞍点出现 
	
	// 输入矩阵
	for ( i=0; i<n; i++) {
		for ( j=0; j<n; j++ ){
			scanf("%d", &A[i][j]);
		}
	} 
	
	/* // 测试 
	int maxMatrix[n][n];
	memset(maxMatrix,0,sizeof(maxMatrix));
	printf("%d",sizeof(maxMatrix));
	printf("%d", maxMatrix[0][0]); 
	*/
	
	// 识别每行最大值 
//    int maxMatrix[n][n] = {0};  //c99不允许 
	int maxMatrix[n][n]; //存放每行最大值的矩阵,每行最大的位置返回1,其余0 
	memset(maxMatrix,0,sizeof(maxMatrix)); // 初始化为0,注意开头要添加memset所在的库 
	int maxNum; //每行最大值
	int maxNO ; // 每行最大值所在位置
	for ( i=0; i<n; i++) {
		maxNum = A[i][0]; //每行最大值,初始第一个数
		maxNO = 0; // 每行最大值所在位置,初始第一个
		for ( j=1; j<n; j++) {
			if (maxNum < A[i][j]) {
				maxNum = A[i][j];
				maxNO = j;
			}
		}
		maxMatrix[i][maxNO] = 1; // 每行最小的返回1 
	}
	
	
	// 识别每列最小值 
	int minMatrix[n][n]; //存放每列最小值的矩阵,每列最小的位置返回1,其余0 
	memset(minMatrix,0,sizeof(minMatrix)); // 初始化为0,注意开头要添加memset所在的库 
	int minNum; // 每列最小值
	int minNO; // 每列最小值所在位置
	for ( j=0; j<n; j++) {
		minNum = A[0][j]; //每列最小值,初始第一个数
		minNO = 0; // 每列最小值所在位置,初始第一个
		for ( i=1; i<n; i++) {
			if (minNum > A[i][j]) {
				minNum = A[i][j];
				minNO = i;
			}
		}
		minMatrix[minNO][j] = 1; // 每列最小的返回1 
	}
	
	
	// 判断鞍点
	for (i=0; i<n; i++ ) {
		for ( j=0; j<n; j++) {
			if (maxMatrix[i][j] && minMatrix[i][j]){
				printf("%d %d\n", i, j); // 输出鞍点坐标 
				exist = 1;
			}
		}
	} 
	
	// 没有出现过鞍点输出"NO"
	if (!exist) printf("NO");
	
	return 0;
}

week - 7

7.1 计算每行句子中每个单词的长度

#include <stdio.h>
#include <string.h>/* strlen */

int main(){
	char string[100]; // 定义字符串大小
	int len; //计算每个字符串大小 
	int init = 0; // 定义最初不要输出空格 
	do {
		scanf("%s", string); // 输入单词 
		len = strlen(string); // 计算字符串长度 ,注意要调用 <string.h>
		if (init) printf(" "); // 除了第一个,其它前面都要输出空格 
		init = 1;
		if ( string[strlen(string)-1] == '.' ) {
			printf("%d", len-1);
		} else printf("%d", len); // 带.字符串长度剪1,否则不用 
	} while (string[strlen(string)-1] != '.' ); // 没有"."继续输入 
	
	return 0;
}

7.2 gps数据处理

#include <stdio.h>
#include <string.h>


int main(){
	// 声明变量
	char str[200]; // 读入语句存放的字符串 
	int len; // 读入的语句长度 
	
	char begining[] = "$GPRMC" ;// 开头
	char middle[] = ",A,";
	char end[] = "END"; 
	
	int sum; // 异或的初始值 
	int i,j; // 参与for循环 
	int part1End; // *的位置 
	int mod = 65536; // 取余的数 
	
	char check[5]; // 存放*后面16进制数的字符串 
	int check16; // 转换成16进制后的数字
	
	int hour; //小时
	int minute; // 分钟
	int second; // 秒 
	int exist; // 判断是否得到时间  



	
	// 1. 读数 2. 判断 3. 获得时间 4. 如果输入END退出循环 
	do {
		scanf("%s", str); // 读入
		len = strlen(str); // 读入字符串长度
		if ( strncmp(str, begining, 6)==0 && strstr(str, middle)) { // 开头是"$GPRMC"和中间有",A,"才来进入下一步 
			// printf("OK!") // 测试
			
			// 异或值 
			sum = 0; // 初始值为0.因为与0异或的都等于它本身
			part1End = strcspn(str, "*"); //  strcspn(str1, str2)统计str1中没有出现str2中一个字符前的个数 
			for ( i=1; i<part1End; i++) {
				sum ^= str[i];
			}
			
			// 1. sum取余 2. *后面是16进制,sum是10进制,要把*后面的数标志成16进制才可以与sum相比较 
			sum %= mod; // 取余 
			// 读取*后面的16进制的数
			for ( i=part1End+1,j=0; i<len; i++,j++ )  {
				check[j] = str[i];
			}
			sscanf(check, "%x", &check16); // 把*后面的标志成16进制,才可以与sum直接比较 
			if ( sum==check16 ) {
				sscanf(str, "$GPRMC,%2d%2d%2d", &hour, &minute, &second);
				exist = 1; 
			}
		}	
	}  while (strcmp(str, end) != 0);
	
	if (exist==1){
		hour = (hour+8)%24; // 转化成北京时间 
		hour<10? printf("0%d:",hour):printf("%d:",hour); // 如果<10则补0,下同 
		minute<10? printf("0%d:",minute):printf("%d:",minute);
		second<10? printf("0%d:",second):printf("%d:",second);
	} 
	else printf("Oh,no");

	return 0;
}

想要了解异或计算过程可以参考我另外一篇博客C语言中的异或 - 运算符"^"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值