C语言习题

目录

简单习题

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 = &num;
	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.两个字符串连接程序 。

复杂习题

posted @ 2021-04-19 18:35  W-forever  阅读(416)  评论(0)    收藏  举报