🎉前言
🎉欢迎关注🔎点赞👍收藏??留言📝 🎉推荐up主专题文章【C语言重难点总结】 📌QQ:3052645092 有问题可以一起讨论哦 🍭作者水平很有限,如果发现错误,请及时告知作者哦!感谢感谢!
本篇涵盖C语言100道常见的编程题,适用于“专接本,专升本,考研,期中期末考试”,每道题都是亲自手动打出来的,也在编译器上测试过,每道题都有相关的详细注释,如有发现错误,欢迎评论区指正。对于零基础伙伴或者没咋做过编程题的小伙伴真心希望将这篇文章的每道题至少【做三遍】,没有人做一遍就能全部都学会,我自己在做编程题时也是做了好几遍,做完之后过一段时间可能也会忘,这就说明还是不熟,就像打王者荣耀时,你不可能上去就会玩的很好,如果你有英雄联盟基础肯定是稍微熟悉一下王者就可以很快上手,其实做这些题也是,锻炼的是一种意识,意识就熟能生巧,很喜欢韩顺平老师课上提到的一句话:“我亦无他,唯手熟尔”,其实也没什么,就是手熟罢了!记住哦!多做几遍,这些题应付接本,升本,绰绰有余。加油,铁铁![看看发文效果,如果时间允许可能会出一些题的视频讲解版]
??1.十进制数转任意进制数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
int i = 0, j = 0, num[20], base, n = 0;
char ch[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F' };
printf("请输入一个数:");
scanf("%d", &n);
printf("请输入要转换的进制数:");
scanf("%d", &base);
do{
num[i] = n%base;
n = n / base;
i++;
} while (n != 0);
for (j = --i; j >= 0; j--){
printf("%c", ch[num[j]]);
}
return 0;
}
??2.数字三角形
??本题需要看图代数去试:
?
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
int i, j, k,t=0;
for (i = 1; i <= 9; i++){
t = 0;
while (8 - i >= t){
t++;
printf(" ");
}
for (j = 1; j <= i; j++)
printf("% d", j);
for (k = i - 1; k > 0; k--)
printf("% d", k);
printf("\n");
}
return 0;
}
?
??3. 编程求某年第 n 天的日期。
??用数组表示月天数。
int main(){
int year, days, month = 0;
int a[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
printf("请输入年,天数:");
scanf("%d%d", &year, &days);
int t = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
while (days > 0 && days < 365 + t){
days -= a[month];
month++;
}
if (days < 0){
month--;
days += a[month];
}
printf("%d-%d-%d \n", year, month + 1, days);
return 0;
}
??求周岁
??4.功能: 输入一个学生的生日(年: y0、 月: m0、 日: d0), 并输入当前日期(年: y1、 月: m1、 日: d1)。 求出该学生的年龄(实足年龄)
int main()
{
int age, y0, y1, m0, m1, d0, d1;
printf("输入生日日期(年,月,日) ");
scanf("%d%d%d", &y0, &m0, &d0);
printf("输入当前日期(年,月,日)");
scanf("%d%d%d", &y1, &m1, &d1);
age = y1 - y0;
if (m0>m1)age--;
if ((m0 == m1) && (d0>d1))age--;
printf("age=%3d", age);
return 0;
} ```
??5.编程求出使该算式成立时的这两个数,
??5.功能: 算式: (空)2 * 7(空) = 3848 中缺少一个十位数和一个个位数编程求出使该算式成立时的这两个数, 并输出正确的算式。
int main(){
int m, n;
for (m = 1; m <= 9; m++){
for (n = 0; n <= 9; n++){
if ((10 * m + 2)*(7 * 10 + n) == 3848){
printf("%d*%d", 10 * m + 2, 70 + n);
}
}
}
return 0;
}
??6.功能:(较难不用看) 编程求任意给两个日期(年 月 日)相差的天数。
void date(int startyear, int startmonth, int startday, int endyear,
int endmonth, int endday){
int arr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int flagmonth_sta, flagmonth_end, i, j,total=0;
for (i = startyear; i <= endyear; i++){
if (i == startyear)
flagmonth_sta = startmonth;
else flagmonth_sta = 1;
if (i == endyear)
flagmonth_end = endmonth;
else flagmonth_end = 12;
for (j = flagmonth_sta; j <= flagmonth_end; j++){
if (flagmonth_end > 2 && (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)){
arr[2] = 29;
}
else arr[2] = 28;
int start_day, end_day;
if (startmonth == j&&i==startyear)
start_day = startday;
else start_day = 0;
if (endmonth == j&&i == endyear)
end_day = endday;
else end_day = arr[j];
for (int n = start_day; n <= end_day; n++)
{
total++;
}
}
}
printf("%d", total-1);
}
int main(){
int startyear, startmonth, startday;
int endyear, endmonth, endday;
printf("请输入开始的年月日:");
scanf("%d%d%d", &startyear, &startmonth, &startday);
printf("请输入终止的年月日:");
scanf("%d%d%d", &endyear, &endmonth, &endday);
date(startyear, startmonth, startday, endyear, endmonth, endday);
return 0;
}
??7.把一个数的二进制奇数位和偶数位交换
void Print(int num){
int arr[32],count=0;
while (num){
arr[count++]=num % 2;
num /= 2;
}
for (int i = count-1; i >= 0; i--)
printf("%d ", arr[i]);
printf("\n");
}
int Swap(int num){
return ((num & 0xaaaaaaaa) >> 1) + ((num & 0x55555555) << 1);
}
int main(){
int num = 0;
printf("请输入一个数:");
scanf("%d", &num);
printf("初始二进制位:\n");
Print(num);
int result=Swap(num);
printf("Swap后十进制 = %d \n Swap后二进制位:\n",result);
Print(result);
return 0;
}
??8.题目要求找出数组中的两个单身狗
??即数组中只有x个元素是单独不一样的,别的都是有相同的兄弟
int main(){
int arr[10] = { 1, 2, 5, 4, 9, 0, 1, 2, 3, 4 };
int flag;
for (int i = 0; i < 10; i++){
flag = 0;
for (int j = 0; j < 10; j++){
if (arr[i] == arr[j]){
flag++;
}
}
if (flag <= 1)printf("单身狗= %d\n", arr[i]);
}
return 0;
}
??9. 数字字符串转换为整数
int isNumber(char a[]){
int i = 0, flag = 0;
if (a[0] == '-'){
for ( i = 1; a[i] != '\0'; i++){
if (!(a[i] >= '0'&&a[i] <= '9'))
break;
}
if (a[i] == '\0')
flag = -1;
}
else {
for (i = 0; a[i] != '\0'; i++){
if (!(a[i] >= '0'&&a[i] <= '9'))
break;
}
if (a[i] == '\0')
flag = 1;
}
return flag;
}
void str_num(char a[]){
int i = 0,num=0,flag=1;
int start=-1;
int flag11=isNumber(a);
if (flag11 == 0){
printf("不是合法数字字符\n");
return;
}
else if (flag11 == -1){
flag = -1;
start = 1;
}
else if (flag11 == 1){
flag = 1;
start = 0;
}
for (i = start; a[i] != '\0'; i++){
num = num * 10 + a[i] - '0';
}
num *= flag;
printf("转换为的整数字符是:%d\n", num);
}
int main(){
char a[10];
printf("请输入一个字符串:");
gets(a);
str_num(a);
return 0;
}
??10.升序的数组插入一个数,还保持升序
void insert(int a[], int n,int sz){
int i = 0;
for (i = sz - 2; i >= 0; i--){
if (n < a[i]){
a[i + 1] = a[i];
}
else {
a[i + 1] = n;
break;
}
}
if (i == -1)
a[0] = n;
}
int main(){
int a[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 10, 12 };
int sz = sizeof(a) / sizeof(a[0]);
int n = 0;
printf("请输入一个数字:");
scanf("%d", &n);
insert(a, n,sz);
for (int i = 0; i < 11; i++){
printf("%d ", a[i]);
}
return 0;
}
??11.输入年 月 判断该月多少天
#include<stdio.h>
int main(){
int y = 0;
int m = 0;
int arr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
while (scanf("%d %d", &y, &m) != EOF){
int day = arr[m];
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0){
if (m == 2)
day += 1;
}
printf("%d\n", day);
}
return 0;
}
??12 遍历法求名次
int main(){
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
for (a = 0; a <= 5; a++){
for (b = 0; b <= 5; b++){
for (c = 0; c <= 5; c++){
for (d = 0; d <= 5; d++){
for (e = 0; e <= 5; e++){
if ((b == 2) + (a == 3) == 1
&& (b == 2) + (e == 4) == 1
&& (c== 1) + (d == 2) == 1
&&(c == 5) + (d == 3) == 1
&& (e == 4) + (a == 1) == 1){
if (a*b*c*d*e==120)
printf("a=%d,b=%d,c=%d,d=%d,e=%d\n", a, b, c, d, e);
}
}
}
}
}
}
return 0;
}
??13. 谁是凶手
int main(){
char murder;
for (murder = 'A'; murder <= 'D'; murder++){
if ((murder != 'A') + (murder == 'C') + (murder == 'D') + (murder != 'D')
==3){
printf("murder是 %c\n", murder);
}
}
return 0;
}
??14.输入一个整数数组,实现一个函数,来调整数组中的奇数和偶数的位置,奇数在前偶数在后
void reverse(int a[], int sz, int temp1[], int temp2[]){
int j_num = 0, o_num=0, i;
for (i = 0; i < sz; i++){
if (a[i] % 2 == 0){
temp1[o_num++] = a[i];
}
else if (a[i] % 2 != 0){
temp2[j_num++] = a[i];
}
}
for (i = 0; i < j_num; i++){
a[i] = temp2[i];
}
for (int j=0; j < o_num; j++,i++){
a[i] = temp1[j];
}
}
int main(){
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int temp1[10];
int temp2[10];
int sz = sizeof(a) / sizeof(a[0]);
reverse(a, sz,temp1,temp2);
for (int i = 0; i < sz; i++){
printf("%d ", a[i]);
}
return 0;
}
??法2:
void reverse(int left[], int right[]){
while (left < right){
while ((left<right)&&*left % 2 != 0){
left++;
}
while ((right>left)&&*right % 2 == 0){
right--;
}
if (left < right){
int temp = *left;
*left = *right;
*right = temp;
}
}
}
int main(){
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sz = sizeof(a) / sizeof(a[0]);
reverse(a, a+sz-1);
for (int i = 0; i < sz; i++){
printf("%d ", a[i]);
}
return 0;
}
??15.1元一瓶汽水,两个空瓶可以换一瓶,问20元可以喝多少瓶
int main(){
int total = 0, empty = 0, money;
printf("请输入钱数:");
scanf("%d", &money);
total = money;
empty = money;
while (empty >= 2){
total += empty / 2;
empty = empty / 2 + empty % 2;
}
printf("能喝 %d 瓶\n", total);
return 0;
}
??16.打印一个菱形,输如n的打印2*n - 1行的菱形
int main(){
int n = 0;
printf("请输入一个数字:");
scanf("%d", &n);
int i, j;
for (i = 0; i < n; i++){
for (j = 0; j < n - 1 - i; j++){
printf(" ");
}
for (j = 0; j <= 2 * i; j++){
printf("*");
}
printf("\n");
}
for (i = 0; i < n - 1; i++){
for (j = 0; j <= i; j++){
printf(" ");
}
for (j = 0; j <= 2 * n - 4 - 2 * i; j++){
printf("*");
}
printf("\n");
}
return 0;
}
??17.输入一个整数找出紧跟在他后面的素数
int find(int n){
int i;
while (n){
for ( i = 2; i < n; i++){
if (n%i == 0){
break;
}
}
if (n == i)return n;
n++;
}
printf("输入不合法");
return -1;
}
int main(){
int n = 0;
printf("请输入一个大于1的数:");
scanf("%d", &n);
printf("紧跟的素数是:%d", find(n));
return 0;
}
??18.计数求和,Sn=2+22+222+2222+22222
int main(){
int a = 0, total = 0, n = 0, temp = 0;
printf("请输入一个数:a\n");
scanf("%d", &a);
printf("请输入这个数的幂次:n\n");
scanf("%d", &n);
while (n){
temp = temp * 10 + a;
total += temp;
n--;
}
printf("%d", total);
return 0;
}
??19.输入两个数求最小公倍数和最大公因数,代码中有详解
??法1:
int main(){
int n, m;
printf("请输入两个数:");
scanf("%d%d", &n, &m);
if (m < n){
m = m^n;
n = n^m;
m = n^m;
}
int p = m*n;
int i;
for ( i = n; i >= 1; i--){
if (m%i == 0 && n%i==0){
printf("最大公因数=%d\n", i);
break;
}
}
printf("最小公倍数就是两数的积除以最大公约数=%d", p / i);
return 0;
}
??法2:
int main(){
int n, m;
printf("请输入两个数:");
scanf("%d%d", &n, &m);
if (m < n){
m = m^n;
n = n^m;
m = n^m;
}
int p = m*n;
int r = 0;
while (n){
r = m%n;
m = n;
n = r;
}
printf("最大公约数是:%d, 最小公倍数是:%d\n", m, p / m);
return 0;
}
??递归版
int fun(int m, int n){
if (n == 0)return m;
else {
int r = m%n;
m = n;
n = r;
return fun(m, n);
}
}
int main(){
int m, n;
printf("请输入两个数:\n");
scanf("%d%d", &m, &n);
if (m < n){
int t = m;
m = n;
n = t;
}
printf("最大公约数是:%d\n", fun(m, n));
return 0;
}
??20.一个数 +100之后是完全平方数,+168还是一个完全平方数
#include<math.h>
int main(){
int n = 1, t = 0, k = 0,m=0,k1;
while (n){
k1 = sqrt(n+100);
k = sqrt(n+168);
if (k*k == n+168&&k1*k1==n+100){
printf("%d",n);
break;
}
n++;
}
return 0;
}
??21 .数字金字塔
int main(){
int n = 0;
printf("请输入一个数:");
scanf("%d", &n);
int i = 0, j = 0;
for (i = 0; i < n; i++){
for (j = 0; j < n - 1 - i; j++)
printf(" ");
for (j = 0; j <= 2*i; j++){
printf("%d", n);
}
printf("\n");
}
return 0;
}
??22.字符串左旋
??实现一个函数,可以左旋字符中的K个字符 例如:ABCD左旋一个字符变成BCDA ABCD左旋两个字符变成CDAB
void reverse(char a[], char n){
int end=strlen(a) - 1,i;
char temp;
while (n){
temp = a[end];
for (i = end - 1; i >= 0; i--){
a[i + 1] = a[i];
}
a[0] = temp;
n--;
}
}
int main(){
char a[20];
printf("请输入一个字符串:");
gets(a);
int n = 0;
printf("请输入一个左旋的数字:");
scanf("%d", &n);
reverse(a,n);
printf("%s\n", a);
return 0;
}
??23.【稍难不用看】要求:写一个函数判断一个字符串是否是另一个字符串旋转后得到的
?? 例如:ABCDE与EDCBA这俩个显然是abcd与ABCD 这显然不是
#include<string.h>
int judge_string(char* str1, char* str2){
int i, j = 0;
int len = strlen(str1);
for (i = 0; i < len; i++){
if (strcmp(str1, str2) == 0)
return 1;
char endchar = str1[strlen(str1)-1];
for (j = strlen(str1) - 2; j >= 0; j-- ){
str1[j + 1] = str1[j];
}
str1[0] = endchar;
}
return 0;
}
int main(){
char arr1[10] = "ABCDEF";
char arr2[10] = "CDEFAB";
int ret = judge_string(arr1, arr2);
if (ret == 1){
printf("yes");
}
else printf("no");
return 0;
}
??24.给数组删除重复的元素
#include<stdio.h>
#define N 12
int main(){
int a[N] = { 1, 1, 2, 3, 3, 4, 6, 4, 8, 6,9,8};
int i = 0, j = 0, n = N;
printf("==========去重之前=========\n");
for (i = 0; i < n; i++){
printf("%d ", a[i]);
}
for (i = 0; i < n - 1; i++){
for (j = i + 1; j < n; j++){
if (a[i] == a[j]){
for (int k = j; k < n - 1; k++){
a[k] = a[k + 1];
}
--n;
--j;
}
}
}
printf("\n==========去重之后=========\n");
for (i = 0; i < n; i++){
printf("%d ", a[i]);
}
return 0;
}
注意n–了之后,循环的访问范围就减少一个,所以被挪一个减少一个访问范围
??25.C语言编程题求1! + 2! + 3! + 4!… + N!
int main(){
int total = 0, t = 1, i = 0;
int n;
printf("请输入一个数:");
scanf("%d", &n);
for (i = 1; i <=n; i++){
t *= i;
printf("%d的阶乘 : %d\n", i,t);
total += t;
}
printf("总和 %d! :%d\n", n, total);
return 0;
}
??26.C语言编程题求斐波那契数(循环法与递归法)
??递归法
int fib(int n){
if (n > 2){
return fib(n - 1) + fib(n - 2);
}
else return 1;
}
int main(){
int n = 0;
printf("您要得到第几个菲薄纳妾数:");
scanf("%d", &n);
printf("%d\n", fib(n));
return 0;
}
??普通的方法
int fib1(int n){
int a = 1, b = 1, c = 1;
while (n > 2){
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main(){
int n = 0;
printf("您要得到第几个菲薄纳妾数:");
scanf("%d", &n);
printf("%d\n", fib1(n));
return 0;
}
??数组的方法:
int main(){
int a[500];
int n = 0;
printf("请输入一个数n:\n");
scanf("%d", &n);
int i;
a[0] = 1, a[1] = 1;
for (i = 2; i <=n; i++){
a[i] = a[i - 1] + a[i - 2];
}
printf("打印前n个斐波那契数===============\n");
for (i =0 ; i <=n; i++){
printf("%6d ", a[i]);
if ((i + 1) % 5 == 0)printf("\n");
}
return 0;
}
??27.C语言编程输入n,k求n的k次幂(递归与非递归)
??递归法:
int fun(int n, int k){
if (k <1)return 1;
else return n*fun(n, k - 1);
}
int main(){
int n, k;
printf("请输入(n,k):");
scanf("%d%d", &n,&k);
printf("%d", fun(n, k));
return 0;
}
递归过程图:
??非递归法:
int fun(int n, int k){
int total = 1;
while (k--){
total *= n;
}
return total;
}
int main(){
int n, k;
printf("请输入(n,k):");
scanf("%d%d", &n,&k);
printf("%d", fun(n, k));
return 0;
}
??28.(递归)输入一个数,把他的每一位相加在输出出来;
??如1234 1 + 2 + 3 + 4 = 10
int deal(int num){
if (num > 9)
return num % 10 + deal(num / 10);
else return num;
}
int main(){
int num = 0;
printf("请输入一个数:");
scanf("%d", &num);
printf("%d各位相加之后的和是:%d\n", num, deal(num));
return 0;
}
??29.实现函数把字符数组的元素逆序 如“abc“, 逆序成“cba“.
??非递归版
void reverse(char a[]){
int start = 0, end = strlen(a) - 1;
while (start < end){
char temp = a[start];
a[start] = a[end];
a[end] = temp;
start++;
end--;
}
}
int main(){
char a[20];
printf("请输入一个字符串:");
gets(a);
reverse(a);
printf("逆序之后:%s\n", a);
return 0;
}
??递归版:
void reverse(char a[]){
char temp = a[0];
int len = strlen(a) - 1;
a[0] = a[len];
a[len] = '\0';
if (len >= 2){
reverse(a + 1);
}
a[len] = temp;
}
int main(){
char a[20];
printf("请输入一个字符串:");
gets(a);
reverse(a);
printf("逆序之后:%s\n", a);
return 0;
}
??30. 递归拆分整数
void deal(int n){
if (n > 9)deal(n / 10);
printf("%d ", n % 10);
}
int main(){
int num = 0;
printf("请输入一个数:\n");
scanf("%d", &num);
deal(num);
return 0;
}
??31.设计以函数打印乘法口诀表,
??输入9,是99乘法表,输入8是88乘法表
void Print1(int n){
int i = 0, j = 0;
for (i = 1; i <= n; i++){
for (j = 1; j <= i; j++){
printf("%d*%d=%3d ", i, j, i*j);
}
printf("\n");
}
}
int main(){
int num = 0;
printf("请输入一个数:");
scanf("%d", &num);
Print1(num);
return 0;
}
??32.构造一函数判断是否为素数100-200之间(只能被自己和1整除的数)
int main(){
int i = 0;
for (i = 100; i <= 200; i++){
int j;
for (j = 2; j < i; j++){
if (i%j == 0)break;
}
if (i == j)printf("%4d", i);
}
return 0;
}
??33.打印二进制数的奇数位和偶数位;分别打印二进制序列
void Print_two(int n){
int i;
printf("打印奇数位:\n");
for (i = 30; i>=0; i-=2){
printf("%d ", (1 & (n >> i)));
}
printf("\n打印偶数位:\n");
for (i = 31; i >= 0; i -= 2){
printf("%d ", (1 & (n >> i)));
}
}
int main(){
int n = 0;
printf("请输入一个数字:");
scanf("%d", &n);
Print_two(n);
return 0;
}
??34.计算M和N二进制中不同的位数,例如 1和7 有两位不同;
int main(){
int n, m;
printf("请输入2个数:");
scanf("%d%d", &n, &m);
int t = m^n;
int count = 0, i = 0;
while (i < 32){
if (t >> i & 1 == 1){
count++;
}
i++;
}
printf("二进制位不同有%d位\n", count);
return 0;
}
??35.输出1900到2000之间的所有闰年
int main(){
for (int i= 1900; i <= 2000; i++){
if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0 ))
{
printf("%d是闰年 ",i);
}
}
}
??36. 猴子吃桃问题
??有一群猴子,去摘了一堆桃子*商量之后决定每天吃剩余桃子的一半当每天大家吃完桃子之后,有个贪心的小猴都会偷偷再吃一个桃子按照这样的方式猴子们每天都快乐的吃着桃子直到第十天,当大家再想吃桃子时,发现只剩下一个桃子问:猴子们一共摘了多少桃子
当前天吃前一天的一半零一个 .prvday/2+1=curday ---->(curday+1)*2=prvday 前一天/2+1=当前天的数量
int main(){
int curday = 1, prvday = 0;
int days = 9;
while (days > 0){
prvday = (curday + 1) * 2;
curday = prvday;
days--;
}
printf("猴子摘了%d个桃子\n", curday);
return 0;
}
??37.选择排序法 升序排列
Print_(int *a,int sz){
printf("打印数组情况===============\n");
for (int i = 0; i < sz; i++){
printf("%d ", a[i]);
}
printf("\n");
}
int main(){
int a[10] = { 1, 4, 7, 2, 5, 8, 3, 6, 9, 0 };
int i, j, index;
int sz = sizeof(a) / sizeof(a[0]);
for (i = 0; i < sz - 1; i++){
index = i;
for (j = i + 1; j < sz; j++){
if (a[index] >a[j])index = j;
}
if (index != i){
int t = a[index];
a[index] = a[i];
a[i] = t;
}
}
Print_(a,sz);
return 0;
}
??38.冒泡排序法
??比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定性算法。
冒泡排序基础的排序算法,也是我们必须要牢牢掌握的一种算法。
int main(){
int a[10] = { 1, 4, 7, 2, 5, 8, 3, 6, 9, 0 };
int i, j;
int sz = sizeof(a) / sizeof(a[0]);
for (i = 0; i < sz - 1; i++){
for (j = 0; j < sz - 1 - i; j++){
if (a[j]>a[j + 1]){
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
Print_(a, sz);
return 0;
}
??39.求3*3矩阵对角元素的和
int main(){
int total = 0, a[3][3] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 };
int i,j;
for (i = 0; i < 3; i++){
total += a[i][i];
}
for (i = 0, j = 2; i < 3; i++, j--){
if (i != j){
total += a[i][j];
}
}
printf("total=%d\n", total);
return 0;
}
??40.把整数数组中的元素值逆序存放
int main(){
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int left=0, right = sizeof(a) / sizeof(a[0])-1;
while (left < right){
int t = a[left];
a[left] = a[right];
a[right] = t;
left++;
right--;
}
Print_(a, 10);
return 0;
}
??41.杨辉三角形
??42.折半查找—必须建立在有序的数组中
int main(){
int a[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11 };
int left = 0, right = sizeof(a) / sizeof(a[0])-1;
int n,mid=right;
printf("请输入要查找得数:");
scanf("%d", &n);
while (left < right){
if (a[mid] < n){
left = mid;
}
else if (a[mid]>n){
right = mid;
}
else {
printf("找到了 下标是%d\n", mid);
break;
}
mid = (left + right) / 2;
}
if (left >= right)printf("没有找到该元素\n");
return 0;
}
??43. 计算3行 80个字符 的类型个数
int main(){
char ch[3][80];
int i = 0;
int max_sum = 0, min_sum = 0, number_sum = 0, speace_sum = 0, other_sum = 0;
for (i = 0; i < 3; i++){
gets(ch[i]);
for (int j = 0; ch[i][j] != '\0'; j++){
if (ch[i][j]>='a'&&ch[i][j]<= 'z')
min_sum++;
else if (ch[i][j]>='A'&&ch[i][j] <= 'Z')
max_sum++;
else if (ch[i][j]>='0'&&ch[i][j] <= '9')
number_sum++;
else if (ch[i][j]==' ')
speace_sum++;
else other_sum++;
}
}
printf("小写字母:%d\n大写字母:%d\n数字数量:%d\n空格数量:%d\n其它字符数量:%d\n", min_sum, max_sum,\
number_sum,speace_sum, other_sum);
return 0;
}
??44. 原文与密码
??输入A转换为Z B<–>Y c<–>X 以此类推
int main(){
char a[30];
printf("请输入一串字母:\n");
gets(a);
int i = 0;
while (a[i]){
if (a[i] >= 'a'&&a[i] <= 'z'){
a[i] = 'a' + 25-(a[i] - 'a');
}
if (a[i] >= 'A'&&a[i] <= 'Z'){
a[i] = 'A' + 25-(a[i] - 'A');
}
i++;
}
printf("转换之后:%s\n", a);
return 0;
}
??45.模拟strcat字符串连接函数
void My_strcat(char *str1, char *str2){
while (*str1)str1++;
while (*str1 = *str2){
str1++, str2++;
}
}
int main(){
char str1[20];
char str2[20];
printf("请输入两个字符串:");
gets(str1);
gets(str2);
My_strcat(str1, str2);
printf("连接之后:%s\n", str1);
return 0;
}
??46.模拟strlen(3种方法)
??方法1:计数器法
int My_strlen(char *a){
int count = 0;
while (*a != '\0'){
count++;
a++;
}
return count;
}
int main(){
char a[30];
printf("请输入一个字符串:");
gets(a);
printf("字符串的长度是:%d\n", My_strlen(a));
return 0;
}
??方法2:指针减指针法
int My_strlen2(char *a){
int *start = a;
while (*a != '\0')a++;
return a - start;
}
int main(){
char a[30];
printf("请输入一个字符串:");
gets(a);
printf("字符串的长度是:%d\n", My_strlen2(a));
return 0;
}
??方法3:递归方法(图解)
int My_strlen3(char *a){
if (*a == '\0')return 0;
return 1 + My_strlen3(a + 1);
}
int main(){
char a[30];
printf("请输入一个字符串:");
gets(a);
printf("字符串的长度是:%d\n", My_strlen3(a));
return 0;
}
??47.模拟strcmp
int My_strcmp(char *a, char *b){
while (*a == *b){
if (*a == '\0')return 0;
a++, b++;
}
return *a - *b;
}
int main(){
char a[30], b[30];
printf("请输入2个字符串:");
gets(a);
gets(b);
int flag = My_strcmp(a, b);
if (!flag)printf("两个字符串是相等的--返回%d\n",flag);
else printf("两个字符串是不相等的--返回%d\n",flag);
return 0;
}
??48.模拟字符串拷贝函数strcpy
void My_strcpy(char *a, char *b){
while (*a++ = *b++);
}
int main(){
char a[20], b[20];
printf("请输入一个字符串:");
gets(b);
My_strcpy(a, b);
printf("拷贝到a数组之后:%s", a);
return 0;
}
??49.strncpy的模拟
??拷贝给定的个数,若是输入的k大于b字符串长度,直接拷贝b字符串全部
void My_strncpy(char *a, char *b, int k){
while (k&&(*a=*b)){
a++, b++;
k--;
}
if (*a != '\0')*a = '\0';
}
int main(){
char a[20], b[20];
printf("请输入一个字符串:\n");
gets(b);
int k = 0;
printf("请输入拷贝的个数:\n");
scanf("%d", &k);
My_strncpy(a, b, k);
printf("拷贝到a数组之后:%s\n", a);
return 0;
}
??50.strncat模拟实现
在字符串str1后面追加给定的k个字符 思路就别strncpy多一步 先找到str1的’\0’在追加
void My_strncat(char *str1, char *str2, int k){
while (*str1)str1++;
while (k && (*str1 = *str2)){
str1++, str2++;
k--;
}
if (*str1 != '\0')*str1 = '\0';
}
int main(){
char str1[20];
char str2[20];
int k = 0;
printf("请输入两个字符串:");
gets(str1);
gets(str2);
printf("请输入一个数:\n");
scanf("%d", &k);
My_strncat(str1, str2,k);
printf("连接之后:%s\n", str1);
return 0;
}
??51.模拟strncmp
??比较两个字符串的前n个字符是不是相等
int My_strncmp(char *a, char*b, int k){
int t = k;
while (k&&*a == *b){
if (*a == '\0'){
printf("两个字符串都遇到的'\0' 相同 \n\n");
return 0;
}
a++, b++;
k--;
}
if (k == 0){
printf("前%d个字符是相同的退出\n\n", t);
return 0;
}
else return *a - *b;
}
int main(){
char a[30], b[30];
int k;
printf("请输入两个字符串:\n");
gets(a);
gets(b);
printf("请输入一个数K:\n");
scanf("%d", &k);
int flag = My_strncmp(a, b,k);
if (!flag)printf("两个字符串是相等的--返回: %d\n", flag);
else printf("两个字符串是不相等的--返回: %d\n", flag);
return 0;
}
??52.(较难些可以不看)模拟寻找子串的函数strstr
char * My_strstr(char *a, char *b){
if (*b =='\0')return a;
char *na = NULL;
char *nb = NULL;
while (*a){
na = a;
nb = b;
while (*nb == *na&&*na != '\0'&&*nb != '\0'){
nb++, na++;
}
if (*nb == '\0')return a;
a++;
}
if (*a == '\0')return NULL;
}
int main(){
char a[20];
char b[20];
printf("请输入2个字符串:");
gets(a);
gets(b);
char *c=My_strstr(a, b);
if (c != NULL)printf("找的了:%s\n", c);
else printf("没有找的子串\n");
return 0;
}
??53.内存拷贝函数
??memcpy(src,dest,size);size代表拷贝的字节数
void My_memcpy(void *a, void *b, int sz){
char *src = (char*)a;
char *dest = (char*)b;
while (sz){
*src = *dest;
src++, dest++;
sz--;
}
}
int main(){
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int b[10] = { 0 };
My_memcpy(b,a,20);
for (int i = 0; i < 10; i++)
printf("%d ", b[i]);
return 0;
}
??54.判断一个数是不是素数:
void fun(int n){
int i = 0;
for (i = 2; i < n; i++){
if (n%i == 0){
printf("不是素数...");
return;
}
}
if (i == n)printf("是素数...");
}
int main(){
int n = 0;
printf("请输入一个数:\n");
scanf("%d", &n);
fun(n);
return 0;
}
??55.3*3矩阵的转置
void Print(int a[][3]){
int i = 0, j = 0;
for (i = 0; i < 3; i++){
for (j = 0; j < 3; j++){
printf("%d ", a[i][j]);
}
printf("\n");
}
printf("\n");
}
int main(){
int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i = 0, j = 0;
printf("转置之前=============\n");
Print(a);
for (i = 0; i < 3; i++){
for (j = 0; j < i; j++){
int t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
}
printf("转置之后=============\n");
Print(a);
return 0;
}
??56.任何比 2 大的偶数, 总能表示两个素数,
??比如 24=5+19; 5 和 19 都是素数
??解释:
int fun_(int n){
int i = 0;
for (i = 2; i < n; i++){
if (n%i == 0)return 0;
}
if (i == n)return n;
}
int main(){
int n = 0;
do{
printf("请输入一个偶数:");
scanf("%d", &n);
} while (n % 2 != 0);
int t = 2, m = n - 2;
while (t < n&&m >= 2){
if (fun_(t) && fun_(m)){
printf("%d+%d=%d", t, m, n);
break;
}
t++, m--;
}
return 0;
}
??57.输入四位数字输出四个字符
??解释:
??58.把a数组的内容拷贝到b数组每拷贝三个放1个*
??法1:
int main(){
char a[30];
char b[30] = { 0 };
int i = 0, j = 0;
printf("请输入一个字符串:");
gets(a);
for (i = 0; a[i] != '\0'; i++){
b[j++] = a[i];
if ((i + 1) % 3 == 0){
b[j++] = '*';
}
}
printf("%s", b);
return 0;
}
??法2:
int main(){
char a[30];
char b[30] = { 0 };
int i = 0, j = 0;
printf("请输入一个字符串:");
gets(a);
char *p = a;
while (*p){
for (i = 1; i <= 3 && *p != '\0'; i++, p++)
b[j++] = *p;
if (*p!='\0')
b[j++] = '*';
}
printf("拷贝之后: %s\n", b);
}
??59.输入一串字符串把其中最长的字母拷贝放到另一个数组
#include<string.h>
void FindWord(char *a, char *b){
char *na = a;
while (*a){
na = a;
while (*na >= 'a'&&*na <= 'z' || *na >= 'A'&&*na <= 'Z'){
na++;
}
int flag = na - a;
int len = strlen(b);
if (flag > len){
strncpy(b, a, flag);
}
if (*na == '\0')break;
if (na == a)a++;
else a = na + 1;
}
}
int main(){
char a[256] = "1abc22hello";
char b[256] = { 0 };
printf("请输入一个字符串:");
gets(a);
FindWord(a, b);
printf("最长的单词是: %s\n", b);
return 0;
}
??60.16进制转换位10进制
void deal(char *a){
int num = 0, i;
for (i = 0; a[i]; i++){
if (a[i] > '0'&&a[i] <= '9'){
num = num * 16 + a[i] - '0';
}
else if (a[i] >= 'a'&&a[i] <= 'f'){
num = num * 16 + a[i] - 'a' + 10;
}
}
printf("转换为十进制为:%d\n", num);
}
int main(){
char a[9];
printf("请输入一个16进制数:\n");
gets(a);
deal(a);
return 0;
}
??61.输入10个整数,最大的和最后一个位置上的交换,最小的和最前面的那个交换
void deal(int *a, int sz){
int i,max = 0, min = 0;
for (i = 0; i < sz; i++){
if (a[max] < a[i])max = i;
if (a[min]>a[i])min = i;
}
int temp=0;
if (a[0] == a[max]){
temp = a[0];
a[0] = a[min];
a[min] = temp;
max = min;
}
else {
temp = a[0];
a[0] = a[min];
a[min] = temp;
}
temp = a[sz - 1];
a[sz - 1] = a[max];
a[max] = temp;
}
int main(){
int a[10] = { 9, 1, 2, 3, 0, 5, 6, 7, 6, 8 };
printf("=========交换之前==========\n");
for (int i = 0; i < 10; i++){
printf("%d ", a[i]);
}
int sz = sizeof(a) / sizeof(a[0]);
deal(a, sz);
printf("\n=========交换之后==========\n");
for (int i = 0; i < 10; i++){
printf("%d ", a[i]);
}
return 0;
}
??思路: 1.首先找到最大数下标和最小数下标 2.把最小数和a[0]交换 最大数和a[9]交换 3.注意 先换交换 可能出现a[0]存的是最大数 你和最小数交换完之后最大数的下标max要指向先前的最小数下标min
??62.报数问题 n个人 从1报数到3,每次报数到3的那个元素被清空
int main(){
int a[300], n, i=0, j=0, k=0;
printf("请输入一个数:\n");
scanf("%d",&n);
for (i = 0; i < n; i++){
a[i] = i + 1;
}
i = 0;
int tt = 0;
while (n - 1 > tt){
if (a[i] != 0){
k++;
if (k == 3){
a[i] = 0;
k = 0;
tt++;
}
}
i++;
if (i == n)i = 0;
}
for (i = 0; i < n; i++){
if (a[i] != 0)printf("幸存者:a[%d]\n", i);
}
return 0;
}
??思路: 1.为数组赋值n个数 2.结束条件是 tt == n-1也就是 淘汰掉了n-1个还剩一个人 3.a数组元素不为0 报数+1 4.k==3报到3踢人 淘汰的人数+1 k=0 重新开始 5.报完一轮 存活的还大于1 从新开始
??63.输入多个字符串,排序后输出
void sort(char str[5][10]){
int i = 0, j = 0;
char temp[10];
for (i = 0; i < 4; i++){
for (j = 0; j < 5 - 1 - i; j++){
if (strcmp(str[j], str[j + 1])>0){
strcpy(temp, str[j]);
strcpy(str[j], str[j+1]);
strcpy(str[j+1], temp);
}
}
}
}
int main(){
char str[5][10] = { "bbbbb", "aaaaa", "ccccc", "fffff", "eeeee" };
printf("=========排序之前========\n");
for (int i = 0; i < 5; i++){
printf("%s\n", str[i]);
}
sort(str);
printf("\n=========排序之后========\n");
for (int i = 0; i < 5; i++){
printf("%s\n", str[i]);
}
return 0;
}
??64.(难可不看)输入一个字符串,将连续的数字字符串放到另一个二维数组中
int Find_number(char a[], char ch[][20]){
char *na = a, row=0;
while (*a){
na = a;
while (*na >= '0'&&*na <= '9'){
na++;
}
if (na == a)a++;
else {
char *temp = a,flag=0;
for (temp; temp < na-1; temp++){
if ((*temp+1)!= *(temp + 1))break;
}
if (temp == na - 1){
flag = 1;
}
else {
temp = a;
for (temp; temp < na - 1; temp++){
if ((*temp - 1) != *(temp + 1))break;
}
if (temp == na - 1) flag = 1;
}
if (flag == 1){
strncpy(ch[row++], a, na - a);
}
if (na == '\0')break;
a = na + 1;
}
}
return row;
}
int main(){
char a[100];
char ch[10][20] = { 0 };
printf("请输入一串字符内包含连续数字:\n");
gets(a);
int row=Find_number(a, ch);
printf("提取出来的数字字符串是:\n");
for (int i = 0; i <row; i++){
printf("串%d: %s\n",i+1, ch[i]);
}
return 0;
}
??思路: 1.外层用a指针变量来控制循环 2.定义char na 在内层变化找一段数字字符 3.判断是不是连续的 4.找到了就拷贝到ch数组 用一个变量控制ch数组下标
??65.结构体指针问题
??66.三天打鱼两天晒网, 第 N 天是打鱼还是晒网?
int main(){
int days = 0;
printf("请输入天数:\n");
scanf("%d", &days);
if (days % 5 == 0 || (days+1) % 5 == 0)printf("在晒网...");
else printf("在打鱼...\n");
return 0;
}
??67.输入多个字符串, 然后输出最短的字符串
void Find_minlen(char a[][20]){
int len = strlen(a[0]);
int flag = 0;
for (int i = 1; i < 3; i++){
if (len>strlen(a[i])){
len = strlen(a[i]);
flag = i;
}
}
printf("最短第字符串是:%s \n", a[flag]);
}
int main(){
char a[3][20] = {"abxc","abc","hello"};
Find_minlen(a);
return 0;
}
??68. 3 个数, 有两个数一样, 找另一个数
int main(){
int a[3] = { 1, 1, 3};
int sz = sizeof(a) / sizeof(a[0]), i, j, count = 0;
printf("=======成员情况========\n");
for (i = 0; i < sz; i++){
printf("%d ", a[i]);
}
printf("\n");
for (i = 0; i < sz; i++){
count = 0;
for (j = 0; j < sz; j++){
if (a[i] == a[j])count++;
}
if (count == 1)printf("单身狗是:%d\n", a[i]);
}
}
??69.有 1000 人捐款, 捐到 10 万就停止捐款。 统计捐款人数和总额
int main(){
double total_money = 0, money = 0;
int person_num = 0;
while (total_money < 100000){
person_num++;
printf("请第%d个慈善家捐款:\n",person_num);
scanf("%lf", &money);
total_money += money;
if (person_num >= 1000)break;
}
if (person_num >= 1000 && total_money < 100000)printf("1000个人没娟够...");
else {
printf("捐款人数:%d\n善款总金额:%.2lf\n", person_num, total_money);
}
return 0;
}
??70.指定位置字符串逆序
void reverse(char *s, int index){
int i = 0;
while (i < index){
char t = s[i];
s[i] = s[index];
s[index] = t;
i++;
index--;
}
}
int find_x(char *s,char x){
for (int i = 0; s[i] != '\0'; i++){
if (x == s[i])
return i;
}
printf("没有找的返回-1\n");
return -1;
}
int main(){
char s[30], x;
printf("请输入一个字符串:\n");
gets(s);
printf("请输入一个字符:\n");
x = getchar();
int index = find_x(s,x);
if (index != -1){
reverse(s, index);
printf("===逆序之后====\n");
printf("%s\n", s);
}
return 0;
}
??在给定的字符串 s寻找一个特定的字符 x,如果找到,返回 x 在 s 的第一次出现的下标,在主函数中把 s 字符串x字符之前的字符逆序输出*
??71.水仙花数
??一个三位数 各位的立方相加等于该数就是水仙花数
int main(){
int i = 0;
for (i = 100; i < 1000; i++){
int a = i % 10;
int b = i / 10 % 10;
int c = i / 100;
if (a*a*a + b*b*b + c*c*c == i)
printf("水仙花数:%d\n", i);
}
return 0;
}
??72.求素数因子
??给一个数,求它的素数因子。一个数(素数除外),均可由若干素数相乘组成。
int fun_1(int n){
int i = 0;
for (i = 2; i < n; i++){
if (n%i == 0){
printf("不是素数需要操作...\n");
return 0;
}
}
if (i == n){
printf("是素数不用操作...\n");
return 1;
}
}
int main(){
int n = 0;
printf("请输入一个数:\n");
scanf("%d", &n);
int flag = fun_1(n);
if (!flag){
int i = 0;
for (i = 2; i <=n; i++){
while (n % i == 0){
printf("%d ", i);
n /= 2;
}
}
}
return 0;
}
??73.判断一个数是不是完全平方数?
#include<math.h>
void deal_(int n){
int t = (int)sqrt(n);
if (t*t == n)printf("%d*%d = %d\n", t, t, n);
else printf("不是完全平方数...\n");
}
int main(){
int n = 0;
printf("请输入一个数:\n");
scanf("%d", &n);
deal_(n);
return 0;
}
??74.蠕虫问题
??一条蠕虫长 1 寸, 其 1 分钟可以向上爬 U 寸, 但是他得休息, 休息的时候下滑 D 寸, 问什 么时候爬出去? 不足 1 分钟按照 1 分钟计算, 蠕虫头部到达井的顶部, 则完成任务, 开始蠕 虫趴在井底(高度为 0)
int main(){
double u, d, js,total=0;
int time = 0;
printf("请输入上爬u 下滑d 井深js:\n");
scanf("%lf%lf%lf", &u, &d, &js);
while (total+1 < js){
total += u;
total -= d;
time++;
time++;
}
total += d;
time -= 1;
printf("%d分钟 ", time);
return 0;
}
??75.结构体排序学生情况
??用结构体来描述一个学生的成绩情况, 内容包括: 姓名、 学号、 C 成绩、 微机原理成绩、 对一个班 30 同学统计求同学平均分、 分数从高到低排名, 打印出名字, 打印出 90 以上和不及格的同学名字
#define N 3
struct student{
char name[10];
int num;
int C;
int W;
int ave;
};
void Print(struct student stu[], int n){
for (int i = 0; i < n; i++){
printf("名字: %s 学号: %d C语言: %d 微原:%d\n ", stu[i].name,
stu[i].num, stu[i].C, stu[i].W);
}
}
void Find(struct student stu[], int n){
for (int i = 0; i < N; i++){
if (stu[i].ave >= 90){
printf("大于90的: ");
printf("名字: %s 学号: %d C语言: %d 微原:%d\n ", stu[i].name,
stu[i].num, stu[i].C, stu[i].W);
}
else if (stu[i].ave < 60){
printf("小于60的: ");
printf("名字: %s 学号: %d C语言: %d 微原:%d\n ", stu[i].name,
stu[i].num, stu[i].C, stu[i].W);
}
}
}
void sort(struct student stu[]){
struct student temp;
for (int i = 0; i < N; i++){
for (int j = 0; j < N - 1 - i; j++){
if (stu[j].ave < stu[j + 1].ave){
temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
}
}
}
Print(stu, N);
Find(stu, N);
}
int main(){
struct student stu[N], temp;
int i = 0;
for (i = 0; i < N; i++){
printf("请输入第%d个学生的信息:名字 学号 C W :\n",i+1);
gets(stu[i].name);
scanf("%d%d%d", &stu[i].num, &stu[i].C, &stu[i].W);
getchar();
int total = stu[i].C + stu[i].W;
stu[i].ave = total /2;
}
sort(stu);
return 0;
}
??76.求一元二次方程的根, ax 方+bx + c = 0, a, b, c 自己输入
如果大于等于 0 x1=-b/2a+判别式/2a x2=-b/2a-判别式/2a
int main(){
double a, b, c, disc, x1, x2, p, q;
scanf("%lf%lf%lf", &a, &b, &c);
disc = b*b - 4 * a*c;
if (disc<0)
printf("无根\n");
else{
p = -b / (2.0*a);
q = sqrt(disc) / (2.0*a);
x1 = p + q;
x2 = p - q;
printf("根为:\nx1=%7.2f\nx2=%7.2f\n", x1, x2);
}
return 0;
}
??77.累加100–999之间个位数为7的素数
int fun_2(int n){
for (int i = 2; i < n; i++){
if (n%i == 0)return 0;
}
return 1;
}
int main(){
int i = 0,total=0;
for (i = 100; i <= 999; i++){
if (fun_2(i)&&i%10==7){
printf(" %5d \n", i);
total += i;
}
}
printf("100--999之间个位数为7的素数和是:%d\n", total);
}
??78.斐波那契兔子
??本质就是求斐波那契数列:
int main(){
int month = 1, total = 0, a = 1,b=0;
int nums;
printf("请输入一个数:");
scanf("%d", &nums);
if (nums == 1)printf("需要1个月\n");
else {
while (total < nums){
total = a + b;
b = a;
a = total;
month++;
printf(" %d ", total);
}
printf("需要%d个月\n", month);
}
return 0;
}
??78.迭代求平方根
int main(){
double a = 0, x0 = 0, x1 = 0;
printf("请输入一个数:\n");
scanf("%lf", &a);
x1 = a;
while (fabs(x0 - x1) > 1e-6){
x0 = x1;
x1 = (x0 + a / x0) / 2;
}
printf("%.2lf的平方根是: %.2lf\n", a, x1);
return 0;
}
??79.累加二维数组边缘元素的和
void Show(int a[][4], int row, int col){
printf("=====数组情况======\n");
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
printf("%d ", a[i][j]);
}
printf("\n");
}
}
void add(int a[][4], int row, int col){
int i = 0, j = 0,total=0;
int n = 2;
while (n > 0){
for (j = 0; j < col; j++)
total += a[i][j];
i = row - 1;
n--;
}
n = 2;
j = 0;
while (n > 0){
for (i = 0; i < row; i++)
total += a[i][j];
j = col - 1;
n--;
}
total = total - a[0][0] - a[0][col - 1] - a[row - 1][0] - a[row - 1][col - 1];
Show(a,row,col);
printf("总和是:%d\n", total);
}
int main(){
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }, s = 0;
add(a, 3, 4);
return 0;
}
??80.逗号表达式方面小题
??81.白马百担问题
??百马百担问题: 有 100 匹马, 驮 100 担货, 大马驮 3 担, 中马驮 2 担, 两匹小马驮 1 担, 问大、 中、 小马各多少匹 ?
int main(){
int dm, zm, xm;
for (dm = 0; dm <=100; dm++){
for (zm = 0; zm <=100 - dm; zm++){
xm = 100 - dm - zm;
if (dm * 6 + zm * 4 + xm == 200){
printf("大妈:%d 中妈:%d 小马: %d\n", dm, zm, xm);
}
}
}
return 0;
}
??82.八进制转10进制
??以下程序的功能是将无符号八进制数字构成的字符串转换为十进制整数。 例如输入的字符串为“556”, 则输出十进制整数 366。
int main(){
char a[9];
int num = 0;
printf("请输入一个八进制数:\n");
scanf("%s", a);
char *p = a;
while (*p){
num = num * 8 + *p - '0';
p++;
}
printf("转换为的十进制数是: %d\n", num);
return 0;
}
??83.func(func(x++, y++), func(–x, --y));函数调用问题
??VS2013上测试:
??解释:
??DEVC++上面测试:
??84.水手分桃子
??思路: 五个人每人独自醒了一次,把全部的桃子分成5份余1个 拿一份给自己 剩下的四份在合起来成为一个整体在去分,也就是最后每个人各自给你自己分了一份,最后一起醒来把剩下的又分为5份余一个,定义一个数组a[6]
int main(){
int index = 0, i = 0, num = 0, a[6] = { 0 };
while (1){
i++;
num = i;
while (num % 5 == 1){
num=(num-1)/ 5;
a[index++]=num;
num *= 4;
}
if (index == 6)
break;
if (index != 6)index = 0;
}
for (index = 0; index < 5; index++){
printf("第%d个人分了%d个\n", index + 1, a[index] + a[5]);
}
printf("全部=%d\n", i);
return 0;
}
??85.挖素数
int main(){
int a[100],i,j;
for (i = 0; i < 100; i++){
a[i] = i + 1;
}
a[0] = 0;
for (i = 1; i < 100; i++){
if (a[i] == 0)continue;
for (j = i + 1; j < 100; j++){
if (a[j] % a[i] == 0 && a[j] != 0){
a[j] = 0;
}
}
}
for (i = 0; i < 100; i++){
if (a[i]!=0)printf("%d ", a[i]);
}
return 0;
}
??86.两个有序递增 的数组存到另一个数组还是有序的
#define N 6
#define M 5
int main(){
int a[N] = { 2, 4, 5, 8, 10, 12 };
int b[M] = { 1, 3, 5, 7, 9 };
int c[N*M];
int ai=0, bi=0, k = 0;
while (ai<N&&bi<M){
if (a[ai] <=b[bi]){
c[k++] = a[ai++];
}
else if (b[bi] < a[ai]){
c[k++] = b[bi++];
}
}
while(ai != N){
c[k++] = a[ai++];
}
while(bi != M){
c[k++] = b[bi++];
}
for (int i = 0; i < k; i++){
printf("%d ", c[i]);
}
return 0;
}
??87.把字符串中的空格去掉
int main(){
char a[20] = "123 456 789";
int i = 0, j = 0;
printf("去掉空格之前: %s\n", a);
for (i = 0; a[i]; i++){
if (a[i] != ' ')a[j++] = a[i];
}
a[j] = '\0';
printf("去掉空格之后:%s\n", a);
return 0;
}
??88.将b字符串的内容插入到a字符串,a字符串保持升序
int main(){
char a[10] = "bceg";
char b[10] = "adf";
int i = 0, j = 0;
for (j = 0; b[j]; j++){
i = strlen(a);
a[i + 1] = a[i];
for (--i; i >= 0; i--){
if (a[i] > b[j]){
a[i + 1] = a[i];
}
else {
a[i + 1] = b[j];
break;
}
}
if (i == -1){
a[i + 1] = b[j];
}
}
printf("操作之后:%s\n", a);
return 0;
}
??89.用递归的方法把字符串逆序
void reverse_(char *a){
char *p = a,ch='\0';
while (*p)p++;
p--;
if (a < p){
ch = *a;
*a = *p;
*p = '\0';
reverse_(a + 1);
*p = ch;
}
}
int main(){
char a[20] = "abcde";
printf("逆序之前:%s\n",a);
reverse_(a);
printf("逆序之后:%s\n", a);
return 0;
}
??90.分解质因数
int main(){
int n = 0;
printf("请输入一个数:\n");
scanf("%d", &n);
if (n > 0){
printf("1");
}
else if(n<0){
printf("-1");
}
for (int i = 2; i <=n; i++){
while (n%i == 0){
printf("*%d", i);
n /= i;
}
}
return 0;
}
??91.10进制转16进制
void deal(int n){
char a[20] = { 0 };
int r = 0,i=0;
while (n){
r = n % 16;
n /= 16;
if (r >= 10){
a[i++] = r + 55;
}
else {
a[i++] = r + '0';
}
}
printf("转换之后:");
for (--i; i >= 0; i--){
printf("%c", a[i]);
}
}
int main(){
int n = 0;
printf("请输入一个数:\n");
scanf("%d", &n);
deal(n);
return 0;
}
??92.10进制转8进制
void deal(int n){
char a[10] = { 0 };
int r = 0,i=0;
while (n){
r = n % 8;
n /= 8;
a[i++] = r + '0';
}
printf("转换之后:");
for (--i; i >= 0; i--){
printf("%c", a[i]);
}
}
int main(){
int n = 0;
printf("请输入一个数:\n");
scanf("%d", &n);
deal(n);
return 0;
}
??93.计算并输出n以内10个最大素数的和
int oop(int n){
int i;
for (i = 2; i < n; i++){
if (n%i == 0)return 0;
}
return 1;
}
int main(){
int n = 0;
printf("请输入一个数: ");
scanf("%d", &n);
int total = 0, t = 0;
int count = 0;
while (n){
if (oop(n)){
count++;
total += n;
printf("(%d). %d ", count, n);
}
n--;
if (count == 10)break;
}
if (count <= 0){
printf("\n输入的%d值太小后面没有10个素数\n", n);
}
else
printf("\n和是:%d\n", total);
return 0;
}
??94.完数
??如果一个数恰好等于它的真因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,他的所以因子相加等于他本身这个数就是完数
int main(){
int i, total = 0;
for (i = 1; i < 1000; i++){
total = 0;
for (int j = 1; j <= i / 2; j++){
if (i%j == 0)total += j;
}
if (total == i)printf("是完数:%d\n", i);
}
return 0;
}
??95.打印X型图案
int main(){
int i, j;
int n = 0;
do{
printf("请输入一个数:\n");
scanf("%d", &n);
for (i = 0; i < n; i++){
for (j = 0; j < n; j++){
if (i == j || j == n - 1 - i)printf("*");
else printf(" ");
}
printf("\n");
}
} while (n >= 2);
return 0;
}
??96.打印空心正方形
int main(){
int i, j;
int n = 0;
do{
printf("请输入一个数:\n");
scanf("%d", &n);
for (i = 0; i < n; i++){
for (j = 0; j < n; j++){
if (i == 0|| j == 0||j==n-1||i==n-1)printf("* ");
else printf(" ");
}
printf("\n");
}
} while (n >= 2);
return 0;
}
??97.判断一个数组是否有序
??利用冒泡排序,看记号flag的变化
int main(){
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, flag1 = 1, flag2 = 2, i, j;
for (i = 0; i < 9; i++)
{
for (j = 0; j < 10 - 1 - i; j++){
if (a[j]>a[j + 1]){
flag1 = 0;
}
if (a[j] < a[j + 1]){
flag2 = 0;
}
}
if (flag1 == 1 || flag2 == 2)break;
}
for (i = 0; i < 10; i++){
printf("%d ", a[i]);
}
if (flag1 == 1)printf("\n是升序\n");
else if (flag2 == 2)printf("\n是降序\n");
else
printf("\n无序\n");
return 0;
}
??98.整形数组删除指定的数字
int main(){
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sz = sizeof(a) / sizeof(a[0]), n, i, j;
printf("请输入一个数字:\n");
scanf("%d", &n);
for (i = 0,j=0; i < 10; i++){
if (a[i] != n)
a[j++] = a[i];
}
if (j == sz)printf("没有找到给定数字...\n");
else {
printf("=====已删除数组情况=====\n");
for (i = 0; i < j; i++){
printf("%d ", a[i]);
}
}
return 0;
}
??99.给字符数组每个元素中间添加一个空格
int main(){
char a[30] = "abc";
int i = 0;
for (i = strlen(a) - 1; i > 0; i--){
a[2 * i] = a[i];
a[2 * i - 1] = ' ';
}
printf("%s", a);
return 0;
}
??100.旋转字符
#include<Windows.h>
int main(){
char *arr = "\/-|";
int i = 0;
while (1){
i %= 4;
printf("[%c]\r", *(arr + i));
i++;
Sleep(60);
}
return 0;
}
??101.求sinx近似值
int main(){
double x = 0, x0 = 0, x1 = 0, total = 0, n = 1, m = 1;
printf("请输入一个数:\n");
scanf("%lf", &x);
total += x;
x1 = x;
int i = 2,f=1;
m = x;
while (fabs(x1 - x0) > 1e-6){
x0 = x1;
for (int t = 2; t > 0; i++){
n *= i;
t--;
}
for (int t = 2; t > 0; t--){
x *= m;
}
f = -f;
x1 = f*(x / n);
total += x1;
}
printf("%lf", total);
return 0;
}
|