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语言中的异或 - 运算符"^"