查看: 105|回复: 0

C语言经典题集合(四)

[复制链接]

5

主题

8

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2023-3-1 11:17:13 | 显示全部楼层 |阅读模式
37.从字符串中查找指定的字符并且将其删除

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
int main()
{
    char str[100];
    char* p = str;
    int z = 0;
    int t = 0;
    char c;
    printf("输入字符串:");
    gets(str);
    printf("输入删除的字符:");
    scanf("%c", &c);
    t = strlen(str);
    for (z = 0; z <= t; z++)
    {
        *p = str[z];
        if (*p != c)
            p++;
    }
    printf("%s", str);
    return 0;
}
38.写一个函数int isprime(int x),如果x是素数返回值为1,否则返回0。

这里摘抄一段网上对于素数的规律总结:
根据素数的定义思考。素数是大于1的自然数,除了1和自身外,其他数都不是它的因子。
那我们就可以用一个循环,从2开始遍历到这个数减去1,如果这个数都不能被整除,那么这个数就是素数。
也就是说:
给定一个数 n , i 从 2 开始取值,直到 n - 1(取整数),如果 n % i != 0 , n 就是素数
进一步思考,有必要遍历到 n - 1 吗?
除了1以外,任何合数最小的因子就是2,那最大的因子就是 n/2
那我们就遍历到 n/2就足够了
nt isPrime(int target) {

    int i = 0;

    if (target <= 1) {
        printf("illegal input!\n");//素数定义
        return -1;
    }

    for (i = 2; i <= target / 2; i++) {
        if (target % i == 0)
            return 0;//不是素数直接返回0
    }

    return 1;//是素数返回1
}39.用递归算法编写求Fibonacci数列第n项值的函数fib(int n),并用主函数输出它的前20项来验证该函数

关于斐波拉第序列,作为程序员,我们只需要知道公式(或者网上找到合适的公式,在计算就好)
F (0)=0, F (1)=1, F (n)= F (n - 1)+ F (n - 2)( n ≥ 2, n ∈ N*)
#include <stdio.h>
int fib(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2);   //公式输进去
}
}
int main(int argc, char* argv[])
{
for (int i = 1; i <= 20; i++)  //第一个到第20个
{
printf("%d\n", fib(i));
}

return 0;
}
vc6.0上的输出结果:




40.定义3个整型变量及指向整型变量的指针变量,利用3个指针变量完成数据的输入、从小到大排序、输出。

#include<stdio.h>
#include<stdlib.h>

int main()

{
   
    int a, b, c;
    int* p1 = &a,* p2 = &b, * p3 = &c;
   
    int temp;
   
    printf("请输入三个整型变量:\n");
   
    scanf("%d%d%d", p1, p2, p3);
   
    if (*p1 > *p2)
    {
        
        temp = *p1;
        
        *p1 = *p2;
        
        *p2 = temp;
        
    }
   
    if (*p1 > *p3)
    {
        
        temp = *p1;
        
        *p1 = *p3;
        
        *p3 = temp;
        
    }
   
    if (*p2 > *p3)
    {
        
        temp = *p2;
        
        *p2 = *p3;
        
        *p3 = temp;
        
    }
   
    printf("%d %d %d\n", *p1, *p2, *p3);
   
    return 0;
   
}输出结果:




41.已知一个整型数组a[10],要求定义2个指向整型变量的指针变量max、min,使得它们分别指向数组的最大数和最小数。

//设定一个数组
//设定两个指针
//将两个指针定义初始化
//循环
//比较大小
//输出
#include<stdio.h>
int main()
{
    int a[5] = { 11,15,99,24,35 }, i;
    int* max, * min;
    max = min = &a[0];
    for (i = 1; i < 5; i++)
    {
        if (*max < a)
            max = &a;
        if (*min > a)
            min = &a;
    }
    printf("max=%d,min=%d\n", *max, *min);
}
42.实现字符串的查找、删除、替换

//实现字符串的查找、删除、替换
# include<stdio.h>
# include<string.h>

//字符串的查找
int find(char *str1,char *str2)//在str1中寻找str2
{
    int len1=strlen(str1);
    int len2=strlen(str2);
    int i=0,index;
    if(len1<len2)
        return -1;//查找失败
    else
    {
        index=0;
        for(i=0;i<len1;i++)
        {
          if(str1==str2[index])
          {
              index++;
              if(index==len2)
                  return i-len2+1;//返回第一次碰到str2的索引
          }
          else
          {
              index=0;
          }
        }
        
        return -1;
    }
}
//字符串的删除
char* delet(char* str,int start,int step)//在str1中删除从start到start+step的子串
{
    int len=strlen(str);
    int i=0;
    if(len<start+step)
        return NULL;//char *返回值NULL
    else
    {
       for(i=start;i<len-step;i++)
       {
           str=str[i+step];
       }
       str[len-step]='\0';//末尾补0,补全新的字符串
       return str;
    }
}

//字符串的替换
char *replace(char *str1,int start,char *str2)
{
   int len1=strlen(str1);
   int len2=strlen(str2);
   int i=0,index=0;
   if(len1<start+len2)
       return NULL;
   else
   {
      for(i=start;i<start+len2;i++)
      {
         str1=str2[index++];
      }

      str1[len1]='\0';
      return str1;
   }

}
int main()
{
    char str1[40];
    char str2[40];
    //删除重复子串
    while(scanf("%s%s",str1,str2)!=EOF)
    {
        int t=find(str1,str2);
    //    printf("%d\n",t);
        while(t!=-1)
        {
            //删除
            char *p=delet(str1,t,strlen(str2));
            t=find(p,str2);
        }
        printf("%s\n",str1);
    }

    return 0;
}43.请编写函数fun,该函数的功能是:移动字符串中的内容,移动的规则如下:把第1到第n个字符,平移到字符串的最后,把第n+1到最后的字符移到字符串的前部

思考中...如果你们有思路,可以评论区说说,谢谢
给它一个空白
44.小明有5本新书,要借给A、B、C这3位小朋友,若每人每次只能借1本,则可以有多少种不同的借法

刚刚那个题欠着,有点没想出来,放松一下....这道题很简单,如果你是高手,可以略过
#include<stdio.h>
int main()
{
    int a, b, c, x = 0;
    for (a = 1; a <= 5; a++)
        for (b = 1; b <= 5; b++)
            for (c = 1; c <= 5; c++)
                if (a != b && a != c && b != c)
                    x++;
    printf("有%d种不同的借法\n", x);
}
45.某市体育彩票采用整数1,2,3,…,36表示36种体育运动,一张彩票可选择7种运动。编写程序,选择一张彩票的号码,使这张彩票的7个号码之和是105且相邻两个号码之差按顺序依次是1,2,3,4,5,6。例如,第一个号码是1,则后续号码应该是2,4,7,11,16,22。

程序分析:若7个号码中的第一个号码是k0,则后续号码之间的关系是ki-ki-1=i。其中i=1,2,3,4,5,6。
(老实说,个人觉得这道题意思有些不明确,号码之差顺序1,2,3和2,4,7是怎么来的,我想了很久....)
#include<stdio.h>
int main()
{
    int a[7];
    int i,sum;
    for(a[0]=1;a[0]<=15;a[0]++)
    {
        for(i=1;i<=6;i++)
            a=a[i-1]+i;
        sum=0;
        for(i=0;i<=6;i++)
            sum+=a;
        if(sum==105)
        {
            for(i=0;i<=6;i++)
                printf("%d ",a);
            printf("\n");
        }
    }
    return 0;
}

46.将一个正整数分解质因数。

例如:输入90,打印出90=2*3*3*5
思路:短除法



#include<stdio.h>
int main()
{
    int n, i;   
    printf("请输入整数:");
    scanf("%d", &n);   //输入这个数
    printf("%d=", n);   //输出左侧n的值
    for (i = 2; i <= n; i++)  //从2开始依次循环
    {
        while (n % i == 0)   
        {
            printf("%d", i);
            n /= i;
            if (n != 1) printf("*");
        }
    }

    printf("\n");
    return 0;
}47.求1-1000以内的回文素数。回文素数指的是这个数既是回文数又是素数。

#include <stdio.h>
int main()
{
    int i, a, b, k;
    for (i = 1; i <= 1000; i++)
    {
        b = 0;
        if ((i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0) || i == 2 || i == 3 || i == 5 || i == 7)  //素数条件
        {
            k = i;
            while (1)
            {
                a = k % 10;
                b = 10 * b + a;
                if (k < 10)
                    break;
                k = k / 10;

            }
            if (b == i)
                printf("%d\n", i);

        }
    }
    return 0;
}输出截图:


48.百万富翁问题

一个百万富翁遇到一个陌生人,陌生人找他谈一个换钱的计划,该计划如下:我每天给你十万元,而你第一天只需给我一分钱;第二天我仍给你十万元,你给我两分钱;第三天我仍给你十万元,你给我四分钱;…,你每天给我的钱是前一天的两倍,直到满一个月(30天)。百万富翁很高兴,欣然接受了这个契约。请编写一个程序计算:这一个月中陌生人给了百万富翁多少钱,百万富翁给陌生人多少钱
#include<stdio.h>
void main()
{
    double i, sum = 0, x = 0.01;
    for (i = 1; i <= 30; i++)
    {

        x *= 2;
        sum += x;
    }
    printf("这一个月中陌生人给了百万富翁%d元\n", 30 * 100000);
    printf("这一个月中百万富翁给了陌生人%f元\n", sum);



    return;
}
vs运行结果:




49.如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数

程序分析:求A的因子之和为B,再求B的因子之和为C。判断A是否等于C。
#include <stdio.h>

int main()
{
    int a, b, i, j, c;
    for(a=1;a<3000;a++)
    {
        b = 0;
        for (i = 1; i <= a / 2; i++)
            if (a % i == 0)
                b += i;
        c = 0;
        for (j = 1; j <= b / 2; j++)
            if (b % j == 0)
                c += j;//    c=b的因子和
        if (a == c && a < b)//    排除重复
            printf("%d和%d为亲密数\n", a, b);
    }      
    return 0;
}为了帮助大家,轻松,高效学习C语言/C++,给大家分享我收集的资源,从最零基础开始的,帮助大家在学习C语言的道路上披荆斩棘!点击上方即可获取,还可以一起来学习交流嗷
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表