C语言习题
目录
- 简单习题
- 1.判断一个数是不是素数
- 2.计算1 - 1/3 + 1/5 - 1/7……
- 3.斐波那契数列
- 4.求两个数的最大公约数,和最小公倍数
- 5.明文变密文
- 6.判断所输入的字符串所含有的空格,字母,数字和其他字符的个数
- 7.冒泡排序
- 8.选择排序
- 9.对一个二维数组转置
- 10.对一个二维数组转置,但不可以引用其他数组
- 11.随机生成五十个数,并求平均值
- 12.连接两个字符数组
- 13.对一个二维数组对角线上下的值进行交换
- 14.对一个一位数组左右倒叙
- 15.判断一个字符数组有几个单词
- 16.判断一个数是不是回文数
- 17.生成九九乘法表
- 18.有1,2,3,4可以生成多少个数
- 19.完全平方数
- 20.判断这一天是该年的第几天
- 21.将三个数从大到小排序
- 22.用*输出c的图案
- 23.输出国际象棋棋盘
- 24.打印楼梯同时在楼梯上上方打印两个笑脸
- 25.打印出所有的水仙花
- 26.分解质因数
- 27.分数排序
- 28.求最大公约数和最小公倍数
- 29.输入一行字符,统计其英文,空格, 数字, 和其他字符的个数
- 29.a + aa + aaa + aaaa
- 30.求一千以内的完数
- 31.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
- 32.猴子吃桃问题
- 33.打印菱形
- 34.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
- 35.1+2!+3!+...+20!
- 36.利用递归函数调用,将输入的五个字符,以相反的顺序打印出来
- 37.求岁数
- 38.计算输入数字的位数,并逆序输出
- 39.有一个五位数,判断他是不是回文数
- 40.删除一个字符串中指定的字符
- 41.判断一个数是否为质数
- 42.字符串反转
- 43.求100之内的素数
- 44.对十个数进行排序
- 45.求一个三乘三矩阵对角线的和
- 46.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
- 47.将一个数组逆序输出
- 48.学习static定义静态变量的用法。
- 49.学习使用auto定义变量的用法
- 50.杨辉三角形(自己没有敲,只是看懂了答案)
- 51.输入3个数a,b,c,按大小顺序输出。
- 51.输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
- 52有 n个整数,使其前面各数顺序向后移 m 个位置,最后m个数变成最前面的 m 个数.
- 53.有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
- 54.写一个函数,求一个字符串的长度,在 main 函数中输入字符串,并输出其长度。
- 55输入一个整数,并将其反转后输出。.
- 56.编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)
- 57.输出年领最大的人
- 58.海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只 猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子
- 59.八进制转换为十进制
- 60.一个偶数总能表示为两个素数之和
- 61.两个字符串连接程序 。
- 62.某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换
- 61.两个字符串连接程序 。
- 61.两个字符串连接程序 。
- 61.两个字符串连接程序 。
- 61.两个字符串连接程序 。
- 复杂习题
简单习题
1.判断一个数是不是素数
方法一:
#<stdio.h>
int main()
{
int i, n;
for(i = 2;i < n;i++)
{
if(n % i == 0 )
{
break;
}
}
if(n == i)
{
printf("%d是素数",n);
}
else
{
printf("%d不是素数",n);
}
}
方法二:
#include<stdio.h>
int main()
{
int i, n, count;
count = 0;
for(n = 1000;n > 1;n--){
for(i = 2;i < (int)sqrt(n) + 1;i ++){
if(n % i == 0)
break;
}
if(n == i){
printf("%d是素数\n",n);
count += 1;
if(count == 3) break;
}
}
}
2.计算1 - 1/3 + 1/5 - 1/7……
#include<stdio.h>
int main()
{
double sum, t;
int i, n, sign;
n = 1,sign = 1,t = 1;
while(fabs(t) > 1e-6){
sum += t;
n += 2;
sign = -sign;
t = sign * 1.0 / n;
}
printf("pi = %8.5f",4 * sum);
}
3.斐波那契数列
#include<stdio.h>
int main()
{
int a, b, c, i, n;
printf("请输入n",&n);
a = 1;b = 1;
for(i = 3;i <= n;i ++){
c = a + b;
printf("%d", c);
a = b;
b = c;
}
}
改进后的代码
#include<stdio.h>
int main()
{
int a, b, c, i, n;
printf("请输入n");
scanf("%d",&n);
a = 1;b = 1;
printf("%-8d%-8d", a, b);
for(i = 3;i < n;i ++){
c = a + b;
printf("%-8d", c);
if(i % 5 == 0)printf("\n");
a = b;
b = c;
}
}
4.求两个数的最大公约数,和最小公倍数
#include<stdio.h>
int main()
{
int m, n, r, m1, n1;
printf("请输入m, n");
scanf("%d %d",&m, &n);
m1 = m;n1 = n;
r = m % n;
while(r != 0){
m = n;
n = r;
r = m % n;
}
printf("%d和%d的最大公约数是%d", m1, n1, n);
}
5.明文变密文
#include<stdio.h>
int main()
{
char c;
c = getchar();
while(c != '\n'){
if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'){
if((c >= 'W' && c <= 'Z') || (c >= 'w' && c <= 'z')
c = c - 22;
else c += 4;
}
printf("%c", c);
c = getchar();
}
}
6.判断所输入的字符串所含有的空格,字母,数字和其他字符的个数
#include<stdio.h>
int main()
{
char c;
int letters=0,spaces=0,digits=0,others=0;
printf("请输入一些字母:\n");
while((c=getchar())!='\n')
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
letters++;
else if(c>='0'&&c<='9')
digits++;
else if(c==' ')
spaces++;
else
others++;
}
printf("字母=%d,数字=%d,空格=%d,其他=%d\n",letters,digits,spaces,others);
return 0;
}
7.冒泡排序
#include<stdio.h>
int main()
{
int a[10] = {1, 2, 3, 4, 6, 8, 9, 0, 5, 7};
int i, j, t;
for(i = 1;i < 10;i ++)
{
for(j = 0;j < 10 - i;j ++)
{
if(a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
for(i = 0;i < 10; i ++)
printf("%d\t", a[i]);
}
8.选择排序
void Select_Sort(int *arr,int len)
{
int small = 0;
for (int i = 0; i < len - 1; i++)
{
small = i;
int j = i + 1;
for (; j < len; j++)
{
if (arr[j] < arr[small]) {
small = j;
}
}
int temp = arr[i];
arr[i] = arr[small];
arr[small] = temp;
}
}
9.对一个二维数组转置
#include<stdio.h>
int main()
{
int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int b[3][3];
int i, j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3;j++)
{
b[j][i] = a[i][j];
}
}
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3;j++)
{
printf("%d\t",b[i][j]);
}
printf("\n");
}
}
10.对一个二维数组转置,但不可以引用其他数组
#include<stdio.h>
int main()
{
int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int i, j, t;
for(i = 0;i < 3;i++)
{
for(j = 0;j < i;j++)
{
t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
}
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}
11.随机生成五十个数,并求平均值
#include<stdio.h>
#include<stdlib.h>
int main()
{
float sum, avg;
int a[50];
int i;
for(i = 0; i < 50; i++){
a[i] = rand() % 40 + 60;
}
for(i = 0; i < 50; i++)
{
sum += a[i];
}
avg = sum / 50;
printf("%lf", avg);
}
12.连接两个字符数组
#include<stdio.h>
int main()
{
char a[30] = "I love ";
char b[40] = "china";
int i, j;
for(i = 0;a[i] != '\0';)
{
i++;
}
for(j = 0;b[j] != '\0';j ++)
{
a[i + j] = b[j];
}
printf("%s", a);
}
13.对一个二维数组对角线上下的值进行交换
#include<stdio.h>
int main()
{
int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int i, j, t;
for(i = 0;i < 3;i++)
{
for(j = 0;j < i;j++)
{
t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
}
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}
14.对一个一位数组左右倒叙
#include<stdio.h>
int main()
{
int a[10] = {2, 6, 8, 3, 43, 67, 23, 54, 12, 56};
int i, t;
for(i = 0;i < 5;i ++)
{
t = a[i];
a[i] = a[9 - i];
a[9 - i] = t;
}
for(i = 0;i < 10;i++)
{
printf("%d\t", a[i]);
}
}
15.判断一个字符数组有几个单词
方法一:
#include<stdio.h>
int main()
{
char sentence[20] = "long long age";
char c;
int i, count;
i = 0;
while((c = sentence[i]) != '\0')
{
if (((c == '.') || (c == ',') || (c == ' ') ) && (sentence[i - 1] != ' '))
{
count ++;
}
i ++;
}
printf("%d\n", count);
}
方法二:
#include<stdio.h>
int main()
{
char ch[20] = "I love china";
int temp = 0;
int i = 0;
int count = 0;
while(ch[i] != '\0')
{
if(ch[i] == ' ')
{
temp = 0;
}
else if(temp == 0)
{
temp = 1;
count ++;
}
i ++;
}
printf("%d", count);
}
16.判断一个数是不是回文数
#include<stdio.h>
int main()
{
int num;
int i;
int temp;
int sum = 0;
printf("请输入一个数:");
printf("num = ");
scanf("%d", &num);
for(i = num;i;i /= 10)
{
temp = i % 10;
sum = sum * 10 + temp;
}
printf("%d\n", sum);
if(sum == num)
{
printf("是回文数%d", num);
}
else
{
printf("不是回文数%d", num);
}
}
17.生成九九乘法表
#include<stdio.h>
int main()
{
int i, j;
for(i = 1;i < 10;i ++)
{
for(j = 1;j < i + 1;j ++)
{
printf("%d * %d = %d\t",i, j, i * j);
}
printf("\n");
}
}
18.有1,2,3,4可以生成多少个数
#include<stdio.h>
int main()
{
int i, j, k, d, count = 0;
for(i = 1;i < 5;i ++)
{
for(j = 1;j < 5;j ++)
{
for(k = 0;k < 5;k++)
{
if(i != j && j != k && i != k)
{
d = 100 * i + 10 * j + k;
printf("%d\t", d);
count ++;
}
}
}
}
printf("%d", count);
}
19.完全平方数
#include <stdio.h>
int main (void)
{
int i, j, m, n, x;
for (i = 1; i < 168 / 2 + 1; i++)
{
if (168 % i == 0)
{
j = 168 / i;
if ( i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0)
{
m = (i + j) / 2;
n = (i - j) / 2;
x = n * n - 100;
printf ("%d + 100 = %d * %d\n", x, n, n);
printf ("%d + 268 = %d * %d\n", x, m, m);
}
}
}
return 0;
}
20.判断这一天是该年的第几天
#include<stdio.h>
int main()
{
int i, j, k, t;
int temp = 0;
int sum = 0;
int a[12] = {0, 31, 59, 90, 120, 181, 212, 243, 273, 304, 334};
printf("请输入年:");
printf("请输入月:");
printf("请输入日:");
scanf("%d", &i);
scanf("%d", &j);
scanf("%d", &k);
if ((i % 400 == 0) || ((i % 4 == 0) && (i % 100 != 0)))
{
temp = 1;
}
for(t = 0;t < j;t++)
{
sum = a[t];
}
if(j > 2 && (temp == 1))
{
sum += temp;
}
sum += k;
printf("%d\n", sum);
}
21.将三个数从大到小排序
#include<stdio.h>
int main()
{
int a, b, c;
printf("请输入三个数:(之间用逗号隔开)");
scanf("%d,%d,%d", &a, &b, &c);
int t;
if(a < b)
{
t = a;
a = b;
b = t;
}
if(a < c)
{
t = a;
a = c;
c = t;
}
if(b < c)
{
t = b;
b = c;
c = t;
}
printf("%d,%d,%d", a, b, c);
}
22.用*输出c的图案
#include "stdio.h"
int main()
{
printf("用 * 号输出字母 C!\n");
printf(" ****\n");
printf(" *\n");
printf(" * \n");
printf(" ****\n");
}
23.输出国际象棋棋盘
#include<stdio.h>
int main()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if((i+j)%2==0)
printf("%c%c",219,219);
else printf(" ");
printf("\n");
}
return 0;
}
24.打印楼梯同时在楼梯上上方打印两个笑脸
#include<stdio.h>
int main()
{
int i,j;
printf("\1\1\n"); /*输出两个笑脸*/
for(i=1;i<11;i++)
{
for(j=1;j<=i;j++)
printf("%c%c",219,219);
printf("\n");
}
return 0;
}
25.打印出所有的水仙花
#include<stdio.h>
int main()
{
int i;
int g, s, b;
for(i = 100; i < 1000;i++)
{
g = i % 10;
s = i % 100 / 10;
b = i / 100;
if(i == g * g * g + s * s * s + b * b * b)
{
printf("%d\n", i);
}
}
}
26.分解质因数
#include<stdio.h>
int main()
{
int i, j;
printf("请输入你要分解的数:");
scanf("%d", &i);
printf("i = ");
do
{
for(j = 2; j <= i; j++)
{
if(i % j == 0)
{
printf("%d", j);
i = i / j;
break;
}
}
}while(i != 0);
}
27.分数排序
#include<stdio.h>
int main()
{
int score;
char grade;
printf("请输入分数");
scanf("%d", &score);
grade = (score >= 90) ? 'A':((score >= 60) ?'B':'C');
printf("%d\n", grade);
}
--抽空学一下问好表达式
28.求最大公约数和最小公倍数
#include<stdio.h>
int main()
{
int a,b,t,r,n;
printf("请输入两个数字:\n");
scanf("%d %d",&a,&b);
if(a<b)
{t=b;b=a;a=t;}
r=a%b;
n=a*b;
while(r!=0)
{
a=b;
b=r;
r=a%b;
}
printf("这两个数的最大公约数是%d,最小公倍数是%d\n",b,n/b);
}
29.输入一行字符,统计其英文,空格, 数字, 和其他字符的个数
#include<stdio.h>
int main()
{
char c;
int letters=0,spaces=0,digits=0,others=0;
printf("请输入一些字母:\n");
while((c=getchar())!='\n')
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
letters++;
else if(c>='0'&&c<='9')
digits++;
else if(c==' ')
spaces++;
else
others++;
}
printf("字母=%d,数字=%d,空格=%d,其他=%d\n",letters,digits,spaces,others);
return 0;
}
29.a + aa + aaa + aaaa
2 + 22 + 222 +
#include<stdio.h>
int main()
{
//i控制个数,j控制值
int i, j;
int a, b;
int temp = 1;
int sum = 0;
int z_sum = 0;
printf("请输入i和j的值");
scanf("%d %d", &i, &j);
for(a = 0; a < i; a ++)
{
temp = temp * 10 ;
sum += (j * temp) / 10;
z_sum += sum;
}
printf("%d", z_sum);
}
30.求一千以内的完数
#include<stdio.h>
int main()
{
int n, i;
int sum;
for(i = 1; i <= 1000; i ++)
{
sum = 0; -- 注意该变量的位置
for(n = 1; n < i; n ++)
{
if(i % n == 0)
{
sum += n;
}
}
if( i == sum)
{
printf("%d\n", i);
}
}
}
31.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
#include<stdio.h>
int main()
{
float mi = 100;
int i = 10;
float sum;
float j;
for(i = 0; i < 10; i++)
{
if(i == 0)
{
sum += 100;
printf("%f\t", sum);
}
else if (0 < i && i < 9)
{
sum = sum + mi * 2;
printf("%f\t", sum);
}
else
{
sum += mi;
printf("%f\t", sum);
}
mi = mi / 2.0;
//printf("%f", mi);
}
printf("%f, %f", mi, sum );
}
32.猴子吃桃问题
#include<stdio.h>
int main()
{
int day, x1 = 0, x2;
day = 9;
x2 = 1;
while(day > 0)
{
x1 = (x2 + 1) * 2;
x2 = x1;
day--;
}
printf("总数是:%d", x1);
}
33.打印菱形
自己写的可能有问题
#include<stdio.h>
int main()
{
int i, j, k;
printf("请输入行数:");
scanf("%d", &i);
for(j = 0; j < i; j++)
{
for(k = 0; k <=10 - j; k++)
{
printf(" ");
}
for(k = 1; k < 2 * (j + 1); k++)
{
printf("*");
}
printf("\n");
}
for(j = i - 1; j > 0; j--)
{
for(k = 0; k <=10 - j + 1; k++)
{
printf(" ");
}
for(k = 1; k < 2 * j; k++)
{
printf("*");
}
printf("\n");
}
}
答案
#include <stdio.h>
int main()
{
int i,j,k;
for(i=0;i<=3;i++) {
for(j=0;j<=2-i;j++) {
printf(" ");
}
for(k=0;k<=2*i;k++) {
printf("*");
}
printf("\n");
}
for(i=0;i<=2;i++) {
for(j=0;j<=i;j++) {
printf(" ");
}
for(k=0;k<=4-2*i;k++) {
printf("*");
}
printf("\n");
}
}
34.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
#include<stdio.h>
int main()
{
int i, t;
float sum = 0;
float a = 2, b= 1;
for(i = 0; i < 20; i++)
{
sum += a / b;
t = a + b;
b = a;
a = t;
}
printf("%f", sum);
}
//答案是32.660263
35.1+2!+3!+...+20!
方法一:
#include<stdio.h>
#include<stdlib.h>
long double jiecheng(int n)//计算阶乘
{
if (n == 1)
{
return 1;
}
else
{
return (n*jiecheng(n-1));
}
}
int main()
{
long double sum = 0;
for (int i = 1; i <= 20; i++)
{
sum = sum + jiecheng(i);
}
printf("sum=%Lf", sum);
system("pause");
}
方法二:
#include <stdio.h>
int main()
{
int i;
long double sum,mix;
sum=0,mix=1;
for(i=1;i<=20;i++)
{
mix=mix*i;
sum=sum+mix;
}
printf("%Lf\n",sum);
}
--从新试一下:没词输出的都是零
36.利用递归函数调用,将输入的五个字符,以相反的顺序打印出来
#include<stdio.h>
void Print(char a[], int n)
{
if(n >= 0)
{
printf("%c",a[n]);
Print(a,n - 1);
}
}
int main(void)
{
char a[5];
printf("请输入5个字符 :");
for(int i = 0; i < 5; i++)
scanf("%c",&a[i]);
printf("相反顺序输出结果 : ");
Print(a,4);
return 0;
}
--自己写的有问题的版本
#include<stdio.h>
void paixu(int * s, int length)
{
while(length != 0)
{
printf("%d", s[length - 1]);
length --;
}
}
int main()
{
int a[5];
int i;
printf("请输入你要交换顺序的数组:");
for(i = 0; i < 5; i++)
{
scanf("%d", &a[i]);
}
for(i = 0; i < 5; i++)
{
printf("%d", a[i]);
}
printf("相反的顺序输出是:");
paixu(a, 5);
}
-递归的方法看不太懂
37.求岁数
#include<stdio.h>
int main()
{
int a = 10;
int b = 5;
int sum = 8;
while(b != 0)
{
sum += 2;
b --;
}
printf("%d", sum);
}
38.计算输入数字的位数,并逆序输出
方法一:
#include <stdio.h>
int main( )
{
long a,b,c,d,e,x;
printf("请输入 5 位数字:");
scanf("%ld",&x);
a=x/10000; /*分解出万位*/
b=x%10000/1000; /*分解出千位*/
c=x%1000/100; /*分解出百位*/
d=x%100/10; /*分解出十位*/
e=x%10; /*分解出个位*/
if (a!=0){
printf("为 5 位数,逆序为: %ld %ld %ld %ld %ld\n",e,d,c,b,a);
} else if(b!=0) {
printf("为 4 位数,逆序为: %ld %ld %ld %ld\n",e,d,c,b);
} else if(c!=0) {
printf("为 3 位数,逆序为:%ld %ld %ld\n",e,d,c);
} else if(d!=0) {
printf("为 2 位数,逆序为: %ld %ld\n",e,d);
} else if(e!=0) {
printf("为 1 位数,逆序为:%ld\n",e);
}
}
方法二:
写完·发现好像比方法一还麻烦
39.有一个五位数,判断他是不是回文数
方法一:(蠢方法)
#include <stdio.h>
int main( )
{
long ge,shi,qian,wan,x;
printf("请输入 5 位数字:");
scanf("%ld",&x);
wan=x/10000; /*分解出万位*/
qian=x%10000/1000; /*分解出千位*/
shi=x%100/10; /*分解出十位*/
ge=x%10; /*分解出个位*/
if (ge==wan&&shi==qian) { /*个位等于万位并且十位等于千位*/
printf("这是回文数\n");
} else {
printf("这不是回文数\n");
}
}
方法二:
只写入判断回文数部分(将输入的数字写在数组中)
while(i < j)
{
if(a[i] != a[j])
{
printf("这不是回文数\n");
return 0;
}
j++;
i--;
}
方法三:
只写入判断回文数部分

40.删除一个字符串中指定的字符
方法一:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// 删除字符串中指定字母函数
char* deleteCharacters(char * str, char * charSet)
{
int hash [256];
if(NULL == charSet)
return str;
for(int i = 0; i < 256; i++)
hash[i] = 0;
for(int i = 0; i < strlen(charSet); i++)
hash[charSet[i]] = 1;
int currentIndex = 0;
for(int i = 0; i < strlen(str); i++)
{
if(!hash[str[i]])
str[currentIndex++] = str[i];
}
str[currentIndex] = '\0';
return str;
}
int main()
{
char s[2] = "a"; // 要删除的字母
char s2[5] = "aca"; // 目标字符串
printf("%s\n", deleteCharacters(s2, s));
return 0;
}
方法二:
#include <stdio.h>
int main(void)
{
char ch;
int i, j;
char s[] = "I want to learn English.";
puts(s);
printf("请输入要删除的字母: ");
scanf("%c", &ch);
for (i = 0; s[i] != '\0'; i++)
{
if (s[i] == ch)
{
for (j = i; s[j] != '\0'; j++)
{
s[j] = s[j + 1];
}
s[j] = '\0';
}
}
puts(s);
return 0;
}
方法三:错误代码,等以后学会了,再进行修改,现在还不懂
#include<stdio.h>
void delete1(char * x);
int main()
{
char * ch = "I love china";
char a;
printf("请输入你要删除的字符:");
scanf("%c", &a);
delete1(ch, a);
printf("%s", ch);
}
void delete1(char * x, char y)
{
int i;
char j;
for(i = 0; x[i] != 0;i ++)
{
if(x[i] == y)
{
j = x[i];
x[i] = y;
y = j;
}
}
}
41.判断一个数是否为质数
#include<stdio.h>
int main()
{
int n;
int i;
printf("请输入一个数(大于一):");
scanf("%d", &n);
for(i = 2; i < n; i++)
{
if(n % i == 0)
{
break;
}
}
if(i == n)
{
printf("%d", n);
}
}
42.字符串反转
方法一:
#include<stdio.h>
#include<string.h>
int main()
{
char ch[20] = "www.runoob.com";
int length;
int i;
length = strlen(ch) / sizeof(char);
printf("%d", length);
for(i = length - 1; i >= 0;i --)
{
printf("%c", ch[i]);
}
}
方法二:
#include <stdio.h>
void reverse(char* s)
{
// 获取字符串长度
int len = 0;
char* p = s;
while (*p != 0)
{
len++;
p++;
}
// 交换 ...
int i = 0;
char c;
while (i <= len / 2 - 1)
{
c = *(s + i);
*(s + i) = *(s + len - 1 - i);
*(s + len - 1 - i) = c;
i++;
}
}
int main()
{
char s[] = "www.runoob.com";
printf("'%s' =>\n", s);
reverse(s); // 反转字符串
printf("'%s'\n", s);
return 0;
}
43.求100之内的素数
方法一(简单):
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k,n=0;
for(i=2;i<=100;i++)
{
k=(int)sqrt(i);
for(j=2;j<=k;j++)
if(i%j==0) break;
if(j>k)
{
printf("%d ",i);
n++;
if(n%5==0)
printf("\n");
}
}
return 0;
}
方法二:
//使用数组存储已经获得的素数,使用该数组做为底,当取值范围较大时可有效减少运算量
#include<stdio.h>
int main()
{
int i,j,k=0,n; //k为素数数组的下标
int prime[1000]; //建立一个素数数组
printf("请输入求素数值的范围(0-1000):\n");
scanf("%d",&n);
prime[0]=2; //给第一个数组元素赋值
for(i=2;i<=n;i++)
{
for(j=0;j<=k;j++)
{
if(i%prime[j]==0) //求余比较只要对当前的素数数组求余即可
break;
}
if(j>k)
{
k++; //判断i是否为素数,如果是,将其加入数组,下标k加一
prime[k]=i;
}
}
for(i=0;i<=k;i++)
printf("%d ",prime[i]);
}
44.对十个数进行排序
#include <stdio.h>
typedef void (*p_func)(int *, int);
void select_sort(int *arr, int size) //选择排序
{
int i = 0, j = 0;
for(i = 0; i < size; i++)
{
for(j = i; j < size; j++)
{
if(arr[i] > arr[j] )
{
arr[i] ^= arr[j];
arr[j] ^= arr[i];
arr[i] ^= arr[j];
}
}
}
}
void bubble_sort(int *arr, int size) //冒泡排序
{
int i = 0, j = 0;
for(i = 1; i < size; i++)
{
for(j = 0; j < size - i; j++)
{
if(arr[j] > arr[j+1])
{
arr[j] ^= arr[j+1];
arr[j+1] ^= arr[j];
arr[j] ^= arr[j+1];
}
}
}
}
void quick_sort(int *arr, int size) //快速排序
{
if(size <= 1)
return;
int base = *arr;
int head = 0, tail = size - 1;
while(head < tail)
{
if(arr[head] > arr[tail])
{
arr[head] ^= arr[tail];
45.求一个三乘三矩阵对角线的和
#include<stdio.h>
int main()
{
int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int i, j;
int sum;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j ++)
{
sum += a[i][j];
}
}
printf("%d", sum);
}
46.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
#include<stdio.h>
int main()
{
int a[11]={1,4,6,9,13,16,19,28,40,100};
int temp1,temp2,number,end,i,j;
printf("原始数组是:\n");
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("\n插入一个新的数字: ");
scanf("%d",&number);
end=a[9];
if(number>end)
a[10]=number;
else
{
for(i=0;i<10;i++)
{
if(a[i]>number)
{
temp1=a[i];
a[i]=number;
for(j=i+1;j<11;j++)
{
temp2=a[j];
a[j]=temp1;
temp1=temp2;
}
break;
}
}
}
for(i=0;i<11;i++)
printf("%4d",a[i]);
printf("\n");
return 0;
}
47.将一个数组逆序输出
#include<stdio.h>
int main()
{
int n, length, i;
int a[20];
int t;
printf("请输入一想要的数组长度:");
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for(i = 0; i < n; i++)
{
printf("%d", a[i]);
}
length = n / 2;
for(i = 0; i < length; i++)
{
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
for(i = 0; i < n;i ++)
{
printf("%d", a[i]);
}
}
48.学习static定义静态变量的用法。
#include<stdio.h>
int main()
{
void fun();
for(int i=0;i<3;i++)
fun();
return 0;
}
void fun()
{
int i=0;
static int static_i=0;
printf("i=%d\n",i);
printf("static_i=%d\n",static_i);
i++;
static_i++;
}
i=0
static_i=0
i=0
static_i=1
i=0
static_i=2
自动(动态)变量:函数中的局部变量不加static关键字修饰就是动态变量。每次调用该函数的时,系统会给它分配存储空间,该函数调用结束释放其存储空间,即动态变量每次被调用都会被赋初值。
静态变量:全局变量都是静态变量,函数中的局部变量加static关键字修饰也是静态变量,格式为:static +类型名+ 变量表。多次调用该函数,只有第一次调用会赋初值,其余调用时,其值都是上次调用该函数执行结束后的值。
49.学习使用auto定义变量的用法
auto
(1)auto关键字在C语言中只有一个作用,那就是修饰局部变量。
(2)auto修饰局部变量,表示这个局部变量是自动局部变量,自动局部变量分配在栈上。(既然在栈上,说明它如果不初始化那么值就是随机的······)
(3)平时定义局部变量时就是定义的auto的,只是省略了auto关键字而已。可见,auto的局部变量其实就是默认定义的普通的局部变量。
#include <stdio.h>
int main()
{
int i,num;
num=2;
for(i=0;i<3;i++)
{
printf("num 变量为 %d \n",num);
num++;
{
auto int num=1;
printf("内置模块 num 变量为 %d \n",num);
num++;
}
}
return 0;
}
以上实例输出结果为:
num 变量为 2
内置模块 num 变量为 1
num 变量为 3
内置模块 num 变量为 1
num 变量为 4
内置模块 num 变量为 1
50.杨辉三角形(自己没有敲,只是看懂了答案)
#include <stdio.h>
int main()
{
int i,j;
int a[10][10];
printf("\n");
for(i=0;i<10;i++) {
a[i][0]=1;
a[i][i]=1;
}
for(i=2;i<10;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<10;i++) {
for(j=0;j<=i;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}
51.输入3个数a,b,c,按大小顺序输出。
程序分析:利用指针方法
--可以改变大小
#include<stdio.h>
void swap(int * a, int * b, int * c);
int main()
{
int a, b, c;
int * p;
int * q;
int * r;
printf("请输入要比较的三个数:");
scanf("%d %d %d",&a, &b, &c);
p = &a;
q = &b;
r = &c;
swap(p, q, r);//a, b, c从大到小
printf("%d %d %d\n", a, b, c);
printf("%d %d %d", *p, *q, *r);
}
void swap(int * a, int * b, int * c)
{
int t;
if(*a < *b)
{
t = *a;
*a = *b;
*b = t;
}
if(*a < *c)
{
t = *a;
*a = *c;
*c = t;
}
if(*b < *c)
{
t = *b;
*b = *c;
*c = t;
}
}
--不可以改变大小,不是很懂
#include<stdio.h>
void swap(int * a, int * b, int * c);
int main()
{
int a, b, c;
int * p;
int * q;
int * r;
printf("请输入要比较的三个数:");
scanf("%d %d %d",&a, &b, &c);
p = &a;
q = &b;
r = &c;
swap(p, q, r);
printf("%d %d %d\n", a, b, c);
printf("%d %d %d", *p, *q, *r);
}
void swap(int * a, int * b, int * c)
{
int * t;
if(*a < *b)
{
t = a;
a = b;
b = t;
}
if(*a < *c)
{
t = a;
a = c;
c = t;
}
if(*b < *c)
{
t = b;
b = c;
c = t;
}
}
--这样式错的,int * 的地址没有赋值
#include<stdio.h>
void swap(int * a, int * b, int * c);
int main()
{
int a, b, c;
int * p;
int * q;
int * r;
printf("请输入要比较的三个数:");
scanf("%d %d %d",&a, &b, &c);
p = &a;
q = &b;
r = &c;
swap(p, q, r);
printf("%d %d %d\n", a, b, c);
printf("%d %d %d", *p, *q, *r);
}
void swap(int * a, int * b, int * c)
{
int ** t;
if(*a < *b)
{
t = &a;
&a = &b;
&b = t;
}
if(*a < *c)
{
t = &a;
&a = &c;
&c = t;
}
if(*b < *c)
{
t = &b;
&b = &c;
&c = t;
}
}
51.输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
#include<stdio.h>
void fun(int * s, int n)
{
int max;
int i;
max = s[0];
int k;
for(i = 1; i < n; i++)
{
if(s[i] > max)
{
max = s[i];
k = i;
}
}
s[k] = s[0];
s[0] = max;
int min;
int j;
min = s[n - 1];
int m;
for(j = n - 2; j >= 0; j--)
{
if(s[j] < min)
{
min = s[j];
m = j;
}
}
s[j] = s[n - 1];
s[n - 1] = min;
}
void printf_s(int *s,int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",s[i]);
printf("\n");
}
int main()
{
int s[20];
int i,n;
printf("设置数组长度(<20):");
scanf("%d",&n);
printf("输入 %d 个元素:\n",n);
for(i=0;i<n;i++)
scanf("%d",&s[i]);
fun(s,n);
printf_s(s,n);
return 0;
}
52有 n个整数,使其前面各数顺序向后移 m 个位置,最后m个数变成最前面的 m 个数.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[20];
int i,n,offset;
//输入数组大小和数组内容
printf("Total numbers?\n");
scanf("%d",&n);
printf("Input %d numbers.\n",n);
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
//输入滚动偏移量
printf("Set your offset.\n");
scanf("%d",&offset);
printf("Offset is %d.\n",offset);
//打印滚动前数组
print_arr(arr,n);
//滚动数组并打印
move(arr,n,offset);
print_arr(arr,n);
}
//打印数组
void print_arr(int array[],int n)
{
int i;
for(i=0;i<n;++i)
printf("%4d",array[i]);
printf("\n");
}
//滚动数组
void move(int array[],int n,int offset)
{
int *p,*arr_end;
arr_end=array+n; //数组最后一个元素的下一个位置
int last;
//滚动直到偏移量为0
while(offset)
{
last=*(arr_end-1);
for(p=arr_end-1;p!=array;--p) //向右滚动一位
*p=*(p-1);
*array=last;
--offset;
}
}
53.有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
#include <stdio.h>
void main()
{
int num[50],n,*p,j,loop,i,m,k;
printf("请输入这一圈人的数量:\n");
scanf("%d",&n);
p=num;
//开始给这些人编号
for (j=0;j<n;j++)
{
*(p+j)=j+1;
}
i=0;//i用于计数,即让指针后移
m=0;//m记录退出圈子的人数
k=0;//k报数1,2,3
while(m<n-1)//当退出的人数不大于总人数时,即留下的人数至少是一个人
//这句不能写成m<n,因为假设有8人,当退出了6人时,此时还是进行人数退出,即m++,
//这时是7<8,剩下的一个人自己喊1,2,3那么他也就退出了,将不会有输出
{
if (*(p+i)!=0)//如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0
{
k++;
}
if (k==3)
{ k=0; //报数清零,即下一个人从1开始报数
*(p+i)=0;//将报数为3的人编号重置为0
m++; //退出人数加1
}
i++; //指针后移
if (i==n)//这句很关键,如果到了队尾,就要使指针重新指向对头
//并且它只能放在i++后面,因为只有i++了才有可能i==n
{
i=0;
}
}
printf("现在剩下的人是:");
for (loop=0;loop<n;loop++)
{
if (num[loop]!=0)
{
printf("%2d号\n",num[loop]);
}
}
}
54.写一个函数,求一个字符串的长度,在 main 函数中输入字符串,并输出其长度。
#include<stdio.h>
#include<malloc.h>
int len(char arr[])
{
int count;
int i;
for(i = 0; arr[i] != '\0';i++)
{
count ++;
}
return count;
}
int main()
{
char arr[30];
int i;
printf("请输入要计算长度的数组:");
gets(arr);
printf("它的长度是:");
i = len(arr);
printf("%d", i);
}
知识补充
https://blog.csdn.net/weixin_42072280/article/details/85111577?utm_source=app&app_version=4.5.5
55输入一个整数,并将其反转后输出。.
#include<stdio.h>
void reverse(int * num)
{
int sum, m;
int cs;
cs = * num;
sum = cs % 10;
cs = cs / 10;
while(cs > 0)
{
m = cs % 10;
sum = sum * 10 + m;
cs = cs / 10;
}
* num = sum;
}
int main()
{
int num;
int * n;
printf("请输入一个整数:");
scanf("%d", &num);
n = #
printf("反转前的数字%d", num);
reverse(n);
printf("反转后的数字是%d", num);
}
56.编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)
#include<stdio.h>
#include<stdlib.h>
double evenumber(int n);
double oddnumber(int n);
int main()
{
int n;
double r;
double (*pfunc)(int);--定义了一个函数指针,指向不同的函数
printf("请输入一个数字:");
scanf("%d",&n);
if(n%2==0) pfunc=evenumber;--对于函数名,可以加取地址符,也可以不加取地址符,都代表函数整体,类似数组名
else pfunc=oddnumber;
r=(*pfunc)(n);
printf("%lf\n",r);
system("pause");
return 0;
}
double evenumber(int n)
{
double s=0,a=0;
int i;
for(i=2;i<=n;i+=2)
{
a=(double)1/i;
s+=a;
}
return s;
}
double oddnumber(int n)
{
double s=0,a=0;
int i;
for(i=1;i<=n;i+=2)
{
a=(double)1/i;
s+=a;
}
return s;
}
指针函数知识点补充
https://blog.csdn.net/luoyayun361/article/details/80428882?utm_source=app&app_version=4.5.5
指针函数用法
函数指针用法
https://blog.csdn.net/qq_27998025/article/details/89045496?utm_source=app&app_version=4.5.5
57.输出年领最大的人
#include<stdio.h>
#include<stdlib.h>
struct man{
char name[20];
int age;
}
person[3]={"li",18,"wang",25,"sun",22};
int main()
{
struct man *q,*p;
int i,m=0;
p=person;
for(i=0;i<3;i++)
{
if(m<p->age)
{
m=p->age;
q=p;
}
p++;
}
printf("%s %d\n",q->name,q->age);
return 0;
}
58.海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只 猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子
59.八进制转换为十进制
自己的方法:有一点小问题
#include<stdio.h>
int main()
{
int a, b, i, sum, c, j;
printf("请输入一个八进制数:");
scanf("%d", &a);
while(a != 0)
{
c = 1;
b = a % 10;
for(j = 0; j < i; j++)
{
c = 8 * c;
}
sum += b * c;
i += 1;
a = a / 10;
}
printf("十进制数是:%d", sum - 1);
}
c = 1一定要放在式子的里面
答案:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n=0,i=0;
char s[20];
printf("请输入一个8进制数:\n");
gets(s);
while(s[i]!='\0'){
n=n*8+s[i]-'0';
i++;
}
printf("刚输入的8进制数转化为十进制为\n%d\n",n);
return 0;
}
60.一个偶数总能表示为两个素数之和
自己的有问题的程序
#include<stdio.h>
int isprime(int a);
int main()
{
int a, j;
printf("请输入一个偶数");
scanf("%d", &a);
for(j = 0; j < a; j++)
{
if(isprime(j) and isprime(a - j))
{
printf("结论成立");
}
}
}
int isprime(int a)
{
int i;
for(i = 0; i < a; i++)
{
if(a % i == 0)
{
break;
}
}
if(a == i)
{
return 1;
}
else
{
return 0;
}
}
答案
#include<stdio.h>
#include<stdlib.h>
int Isprimer(unsigned int n);
int main()
{
unsigned int n,i;
do{
printf("请输入一个偶数:\n");
scanf("%d",&n);
}while(n%2!=0);
for(i=1;i<n;i++)
if(Isprimer(i)&&Isprimer(n-i))
break;
printf("偶数%d可以分解成%d和%d两个素数的和\n",n,i,n-i);
return 0;
}
int Isprimer(unsigned int n)
{
int i;
if(n<4)return 1;
else if(n%2==0)return 0;
else
for(i=3;i<sqrt(n)+1;i++)
if(n%i==0)return 0;
return 1;
}
61.两个字符串连接程序 。
简单版:
#include<stdio.h>
int main()
{
int i, j;
char ch1[20] = "i love";
char ch2[20] = "china";
for(i = 0; ch1[i] != '\0';)
{
i++;
}
for(j = 0 ; ch2[j] != '\0';j++)
{
ch1[i + j] = ch2[j];
}
printf("%s", ch1);
}
高级版:
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
char* strconnect(char *str1,char *str2);
int main()
{
char str1[20],str2[20];
char *str;
puts("请输入两个字符串,用回车分开:");
scanf("%s%s", str1, str2);
str=strconnect(str1,str2);
puts("连接后的字符串为:");
puts(str);
return 0;
}
char* strconnect(char *str1,char *str2)
{
char*str;
str=(char*)malloc(strlen(str1)+strlen(str2)+1);
str[0]='\0';
strcat(str,str1);
strcat(str,str2);
return str;
}
62.某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换
#include <stdio.h>
int main()
{
int a,i,aa[4],t;
printf("请输入四位数字:");
scanf("%d",&a);
aa[0]=a%10;
aa[1]=a%100/10;
aa[2]=a%1000/100;
aa[3]=a/1000;
for(i=0;i<=3;i++)
{
aa[i]+=5;
aa[i]%=10;
}
for(i=0;i<=3/2;i++)
{
t=aa[i];
aa[i]=aa[3-i];
aa[3-i]=t;
}
printf("加密后的数字:");
for(i=3;i>=0;i--)
printf("%d",aa[i]);
printf("\n");
}
61.两个字符串连接程序 。
61.两个字符串连接程序 。
61.两个字符串连接程序 。
61.两个字符串连接程序 。

浙公网安备 33010602011771号