C语言练习——3
- 一、 操作符练习
- 1.1交换两个变量(不创建临时变量)
- 1.2 打印整数二进制的奇数位和偶数位
- 1.3[二进制中1的个数](https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8)
- 1.4[两个整数二进制位不同个数](https://www.nowcoder.com/questionTerminal/9c3b8a8d9f1c4ae3b709d04625586225)
- 1.5[小乐乐走台阶](https://www.nowcoder.com/practice/ebf04de0e02c486099d78b7c3aaec255?tpId=107&&tqId=33398&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking)
- 二、算术转换练习
- 2.1[矩阵计算](https://www.nowcoder.com/practice/0c83231923c541d2aa15861571831ee5?tpId=107&&tqId=33371&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking)
- 2.2[小乐乐与进制转换](https://www.nowcoder.com/practice/242eafef2a704c0ca130d563b7b3ee2d?tpId=107&&tqId=33392&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking)
- 2.3[矩阵转置](https://www.nowcoder.com/practice/351b3d03e410496ab5a407b7ca3fd841?tpId=107&&tqId=33388&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking)
一、 操作符练习
1.1交换两个变量(不创建临时变量)
方法一:
利用算数的方法,先将a+b的值赋给a,然后利用a的新值减去原来的b,便得到了交换后的b的值,同理可得到交换后a的值,但是这种方法由于int的范围不能够处理较大的数。
#include
int main()
{
int a = 3;
int b = 5;
printf("交换前:%d %d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("交换后:%d %d\n", a, b);
return 0;
}
方法二:
利用^操作符,对a和b进行相应的操作,便可以不创建临时变量,便进行两个值的交换。
#include
int main()
{
int a = 3;
int b = 5;
printf("交换前:a = %d b = %d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换后:a = %d b = %d\n", a, b);
}
1.2 打印整数二进制的奇数位和偶数位
题目要求:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
void print(int n)
{
int i = 0;
printf("奇数位:");
for (i = 30; i >= 0; i -= 2)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
printf("偶数位:");
for (i = 31; i >= 1; i -= 2)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
}
#include
int main()
{
int n = 0;
scanf("%d", &n);
print(n);
return 0;
}
1.3二进制中1的个数
![在这里插入图片描述](https://img.php1.cn/3cd4a/1e618/cd5/af17da15769ccb2e.jpeg)
方法一:
int NumberOf1(int n)
{
int i = 0;
int count = 0;
for (i &#61; 0; i < 32; i&#43;&#43;)
{
if (((n >> i) & 1 &#61;&#61; 1))
{
count&#43;&#43;;
}
}
return count;
}
#include
int main()
{
int n &#61; 0;
scanf("%d", &n);
int ret &#61; NumberOf1(n);
printf("%d", ret);
return 0;
}
方法二&#xff1a;
int NumberOf1(int n)
{
int count &#61; 0;
while (n)
{
n &#61; n & (n - 1);
count&#43;&#43;;
}
return count;
}
#include
int main()
{
int n &#61; 0;
scanf("%d", &n);
int ret &#61; NumberOf1(n);
printf("%d", ret);
return 0;
}
1.4两个整数二进制位不同个数
int different(int m, int n)
{
int i &#61; 0;
int count &#61; 0;
for (i &#61; 0; i < 32; i&#43;&#43;)
{
if (((m >> i) & 1) !&#61; ((n >> i) & 1))
{
count&#43;&#43;;
}
}
return count;
}
int main()
{
int n &#61; 0;
int m &#61; 0;
scanf("%d %d", &m, &n);
int ret &#61; different(m, n);
printf("%d", ret);
return 0;
}
1.5小乐乐走台阶
题目描述&#xff1a;小乐乐上课需要走n阶台阶&#xff0c;因为他腿比较长&#xff0c;所以每次可以选择走一阶或者走两阶&#xff0c;那么他一共有多少种走法&#xff1f;
输入描述&#xff1a;
输入包含一个整数n (1 ≤ n ≤ 30)
输出描述&#xff1a;
输出一个整数&#xff0c;即小乐乐可以走的方法数。
#include
int get(int n)
{
if (n <&#61; 2)
return n;
else
return get(n - 1) &#43; get(n - 2);
}
int main()
{
int n &#61; 0;
scanf("%d", &n);
int ret &#61; get(n);
printf("%d", ret);
return 0;
}
二、算术转换练习
2.1矩阵计算
描述
输入NxM矩阵&#xff0c;矩阵元素均为整数&#xff0c;计算其中大于零的元素之和。
输入描述&#xff1a;
第一行为N M(N: 矩阵行数&#xff1b;M: 矩阵列数,且M,N<&#61;10)&#xff0c;接下来的N行为矩阵各行。
输出描述&#xff1a;
一行&#xff0c;其中大于零的元素之和。
#include
int main()
{
int m &#61; 0;
int n &#61; 0;
scanf("%d %d", &m, &n);
int i &#61; 0;
int j &#61; 0;
int tmp &#61; 0;
int sum &#61; 0;
for (i &#61; 0; i < m; i&#43;&#43;)
{
for (j &#61; 0; j < n; j&#43;&#43;)
{
scanf("%d", &tmp);
if (tmp > 0)
{
sum &#61; sum &#43; tmp;
}
}
}
printf("%d\n",sum);
return 0;
}
2.2小乐乐与进制转换
描述
小乐乐在课上学习了二进制八进制与十六进制后&#xff0c;对进制转换产生了浓厚的兴趣。因为他的幸运数字是6&#xff0c;所以他想知道一个数表示为六进制后的结果。请你帮助他解决这个问题。
输入描述&#xff1a;
输入一个正整数n (1 ≤ n ≤ 109)
输出描述&#xff1a;
输出一行&#xff0c;为正整数n表示为六进制的结果
#include
void Print(int n)
{
if(n>5)
{
Print(n/6);
}
printf("%d",n%6);
}
int main()
{
int n&#61;0;
scanf("%d",&n);
Print(n);
return 0;
}
描述
KiKi有一个矩阵&#xff0c;他想知道转置后的矩阵&#xff08;将矩阵的行列互换得到的新矩阵称为转置矩阵&#xff09;&#xff0c;请编程帮他解答。
输入描述&#xff1a;
第一行包含两个整数n和m&#xff0c;表示一个矩阵包含n行m列&#xff0c;用空格分隔。 (1≤n≤10,1≤m≤10)
从2到n&#43;1行&#xff0c;每行输入m个整数&#xff08;范围-231~231-1&#xff09;&#xff0c;用空格分隔&#xff0c;共输入n*m个数&#xff0c;表示第一个矩阵中的元素。
输出描述&#xff1a;
输出m行n列&#xff0c;为矩阵转置后的结果。每个数后面有一个空格。
#include
int main()
{
int n &#61; 0;
int m &#61; 0;
scanf("%d %d", &n, &m);
int i &#61; 0;
int j &#61; 0;
int tmp[10][10] &#61; {0};
for (i &#61; 0; i < n; i&#43;&#43;)
{
for (j &#61; 0; j < m; j&#43;&#43;)
{
scanf("%d", &tmp[i][j]);
}
}
for (i &#61; 0; i < m; i&#43;&#43;)
{
for (j &#61; 0; j < n; j&#43;&#43;)
{
printf("%d ", tmp[j][i]);
}
printf("\n");
}
return 0;
}