头图

(持续更新,最新时间2022年11月26日)

1. 三个数由小到大排序

输入任意3个整数,编程实现对这3个整数进行由小到大排序井将排序后的结果显示在屏幕上

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a, b, c, t;
    printf("请任意输入三个数(空格分隔):\n");
    scanf("%d %d %d", &a, &b, &c);
    if (a < b) 
    { t = a;
     a = b;
     b = t;
    }    
    else if (a < c) 
    { t = a;
    a = c;
    c = t; 
    }    
    else if (b < c)
    { t = b; 
    b = c;
    c = t;
    }   
    printf("从大到小排列为:%d %d %d\n", a, b, c);
    system("pause");
    return 0;
}

2. a²+b²

要求输入整数a和 b, 若a²+b²的结果大与100, 则输出a²+b²的值,否则输出 a+b 的结果

#include <stdio.h>
void main()
{
    int a,b;
    printf("请输入两个整数:\n");
    scanf("%d,%d,",&a,&b);
    if(a*a+b*b>100)
{
        printf("(a*a+b*b)/100=%d",(a*a+b*b)/100);
    }
    else
{
        printf("a+b=%d",a+b);
    }
    return 0;
}

3. 判断闰年

判断任意年份是否为闰年,需要满足以下条件中的任意一个:
该年份能被 4 整除同时不能被 100 整除;
该年份能被400整除

    #include <stdio.h>
    int main()
    {
        int year,a;
        printf("请输人年份:\n");
        scanf("%d",&year);
        if(year%400==0)
            a=1;
        else
        {
            if(year%4==0&&year%100!=0)
                a=1;
            else
                a=0;
        }
        if(a==1)
        {
            printf("%d 此年是闰年\n",year);
        }
        else
        {
            printf("%d 此年非闰年\n",year);
        }
        return 0;
    }

4. 编程判断输入的数是否既是5又是7的整倍数,如果是输出yes, 否则输出no

int main(){
int n;
 scanf("%d",&n);
 if(n%5==0&&n%7==0)
{
 printf("yes");
   }
 else{
 printf("no");
   }
 printf("\n");
 return 0;
}

5. 成绩排名,编程对输入的分数给出相应的等级,分数大于等于90为"A",80-89为"B",70-79 为"C",60-69为"D",60分以下为"E"。

#include<stdio.h>
int main()
{
    int a;
    printf("请输入成绩:");
        scanf("%d",&a);
    if(a>=90&&a<=100)
         printf("等级是A\n");
    else if(a>=80&&a<=89)
         printf("等级是B\n");
    else if(a>=70&&a<=79)
         printf("等级是C\n");
    else if(a>=60&&a<=69)
         printf("等级是D\n");
    else if(a>=0&&a<=59)
         printf("等级是E\n");
    else if(a<0)
         printf("输入错误,请输入1~100的成¦绩");
      getchar();
        return 0;
}

6. 打印乘法口诀表


#include<stdio.h> 
 
int main(){  
    //外层循环变量,控制行  
    int i = 0;  
    //内层循环变量,控制列   
    int j = 0;   
    for(i=1;i<=9;i++){  
        for(j=1;j<=i;j++){  
            printf("%dx%d=%d\t",j,i,i*j);  
        }  
        //每行输出完后换行   
        printf("\n");     
    }  
}

7.打印三角形

#include <stdio.h>
int main() {
  int i, j;
  int line;
  printf("请输入行数:");
  scanf("%d", &line);
  for (i = 0; i <= line; i++) {
    for (j = line - i + 1; j <= line; j++) {
      printf("* ");
    }
    printf("\n");
  }
  return 0;
}

8.序列求和

用while循环做一个简单的计算s=1 + 1/2+ 1/3+ ... + 1/n。

#include <stdio.h>

int main()

{

    int i=1;

    double sum=0;

    while(i<=100){

        sum += 1.0/i;

        i++;

    } 

    printf("sum=%0.2lf",sum);
return;
}

(如果不是题目限制while,这里也可以用for循环,应该也更加直观)

9.整数加减法练习

练习者自己选择是进行加法还是减法运算,之后输入进行多少以内的加法或减法运算,具体数值会由计算机随机产生,输入答案,计算机会根据输人的数据判断结果是否正确

#include<stdio.h>
#include<stdlib.h>        //srand()
#include<time.h>          //time()
int main()
{
    int sign,a,b,c;
    char sign1;
    int max;            //最大范围
    scanf("%d", &sign);
    scanf("%d", &max);
    srand((unsigned long)time(0));
    a = rand() % max;
    b = rand() % max;
    while (sign==1&&a<b)    //如果为减,a又比b小重新生成随机数
    {
        a = rand() % max;
        b = rand() % max;
    }
    sign1 = (sign == 1 ?'-':'+');
    printf("%d%c%d=", a, sign1, b);
    scanf("%d", &c);
    if ((sign == 1) && (a - b == c) || (sign != 1) && (a + b == c))
        printf("right");
    else
        printf("error");
    return 0;
}

10.猴子吃桃问题

猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

include<stdio.h>
int main()
{
int day,x1,x2;
day=9;
x2=1;
while(day>0)
 {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
 x2=x1;
 day--;
 }
printf("the total is %d\n",x1);
return 0;
}

11.数组逆序排序

#include<stdio.h>
int main()
{
    int a[10], i, temp;
    printf("请输入一串要逆序输出的数字:"); //输入一串数字
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);
    putchar('\n');
    for (i = 0; i < 10 / 2; i++)        //将数字逆序输出
    {
        temp = a[i];
        a[i] = a[10 - i - 1];
        a[10 - i - 1] = temp;
    }
    printf("逆序输出后的结果为:");
    for (i = 0; i < 10; i++)
        printf("%3d", a[i]);

    return 0;
}

12.不用strcat 连接两个字符串

思路:先了解下strcat的特性,先看一个网上找的demo:

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char src[50], dest[50];
 
   strcpy(src,  "This is source");
   strcpy(dest, "This is destination");
 
   strcat(dest, src);
 
   printf("最终的目标字符串: |%s|", dest);
   
   return(0);
}

输出结果:
|This is destinationThis is source|

因此明白是把两个段落链接起来的

#include <stdio.h>
main()
{
    char a[100],b[100];
    int i=0,j=0;
    printf("Please input 2 strings:\n");
    gets(a);     //输入字符串啊,a,b
    gets(b);
    while(a[i]!='\0')
        i++;       //  i 表示字符串a的'\0'所在的位置
    while(b[j]!='\0')   //将b中字符一个个赋值给'\0'以及其后面的位置,i++,j++控制一一对应
        a[i++]=b[j++];
    a[i]='\0'     //给一个结束标志
    puts(a);    //输出
    return 0;
}

13.企业利润发放问题

企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
   于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
   成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于
   40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于
   100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

#include <stdio.h>
int main()
{
    unsigned long int i = 0;
    int bonus = 0;
    printf("输入利润:");
    scanf("%ld", &i);
    if (i <= 100000)
        bonus = 100000 * 0.1;
    else if (100000 < i <= 200000)
        bonus = (i - 100000) * 0.075 + 100000 * 0.1;
    else if (200000 < i <= 400000)
        bonus = (i - 200000) * 0.005 + (i - 100000) * 0.075 + 100000 * 0.1;
    else if (400000 < i <= 600000)
        bonus = (i - 400000) * 0.003 + (i - 200000) * 0.005 + (i - 100000) * 0.075 + 100000 * 0.1;
    else if (600000 < i <= 1000000)
        bonus = (i - 600000) * 0.015 + (i - 400000) * 0.003 + (i - 200000) * 0.005 + (i - 100000) * 0.075 + 100000 * 0.1;
    else if(i > 1000000)
        bonus = (i - 600000) * 0.015 + (i - 400000) * 0.003 + (i - 200000) * 0.005 + (i - 100000) * 0.075 + 100000 * 0.1 + (i - 1000000) * 0.001;
    printf("bonus=%d", bonus);

    return 0;
}

14.根据下面的函数关系,输入 X,计算 Y,要求输出结果保留两位小数

(1)当 x 小于 5 时,y=0
(2)当 x 大于 5 且小于等于 10 时,y=sin(x)
(3)当 x 大于 10 时,y=cos(x)+sin(x)

#include <stdio.h>
#include <math.h>
int main() {
    float X;
    double Y;
    scanf("%f",&X);
    if(X<5)
        Y=0;
    else if(X>5&&X<10)
        Y=sin(X);
    else if(X>10)
        Y=cos(X)+sin(X);
    printf("%.2f",Y);
    return 0;
}

15.找10个数中的最大值

这个题和第一个题类似,不过难度相对第一题大了一点点,具体思路是构建一个存放10个数的数组,再设定一个最大值max。然后构建两个循环,第一个循环输入数据,第二个循环比较两个数,最大的取出来(如果是比较最小值,大小符号改变就好)

#include <stdio.h>

 

int main() {

    int a[10];

    int Max = 0;

    for (int i = 0; i < 10; i++) {

        scanf("%d", &a[i]);

    }

    for (int i = 0; i < 10; i++) {

      if(a[i] > Max) {

          Max = a[i];

      }

    }

    printf("十个数中最大的是:%d", Max);

    return 0;

}

16.判定该正整数是否为一个回文数

有些题目难度降低了,改成了(输入一个 3 位的正整数,判断回文数),个人觉得如果是三位,方法会很简单,思路是输入三个数,第一个数和第三个数比较,如果不相同,输出否,否则是。
这道题目没有说明输入数的多少,在网上看到一种方法不错

数字法:

#include<stdio.h>
int main()
{
    int x,newed,t,n;
    while(scanf("%d",&x)!=EOF)
    {
        newed=0;
        n=x;
        do
        {
            newed=newed*10+x%10;
            x/=10;
        }while(x>0);
        if(n==newed)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

字符串处理法:

#include<stdio.h>
#include<string.h>
int main()
{
    int i,length,flag=1;
    char a[100];
    gets(a);
    length=strlen(a);
    for(i=0;i<=length/2;i++) {
       if(a[i]!=a[length-i-1]) {
           flag=0;
           break;
       }
    }
    if(flag==1)
      printf("yes");
    else
      printf("no");
    return 0;
}

17.大小写转换

考点:A-Z的ASCII值为 : 65-90
a-z的ASCII值为 : 97-122
两者相差32

#include<stdio.h>
#include<stdlib.h>
 
int main()
{
 char str[] = "AbCdEf";
 char c;
 int i = 0;
 while (str[i] != '\0')
 {
  c = str[i];
  if (c >= 'A' && c <= 'Z')
  {
   c = c + 32;
  }
  else if (c >= 'a' && c <= 'z')
  {
   c = c - 32;
  }
      printf("%c",c);
  i++;
 }
 printf("\n");
 system("pause");
 return 0;
}

18.计算三位整数的边界

void main()
{
int x;
int max,min;
printf("请输入三位数 x:");
scanf("%d",&x);
x=x/100;
min=(int)x;
min=min*100;
max=min+99;

19.三角形判断

给定平面上任意三个点的坐标(x​1​​ ,y​1​​ )、(x​2​​ ,y​2​​ )、(x​3​​ ,y​3​​ ),检验它们能否构成三角形。
图片.png

#include "stdio.h"
#include "math.h"
int main()
{
    float x1, x2, x3, y1, y2, y3;
    float a, b, c, s, l, area;  //定义三边,半周长,周长,面积 
    scanf("%f%f%f%f%f%f", &x1, &y1, &x2, &y2, &x3, &y3);
    a = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    b = sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
    c = sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
    if (a + b > c && a + c > b && b + c > a) {
        s = (a + b + c) / 2;
        area = sqrt(s * (s - a) * (s - b) * (s - c));  //海伦公式求面积 
        l = a + b + c;
        printf("L = %.2f, A = %.2f\n", l, area);
    } else {
        printf("Impossible\n");
    }
    return 0;
}

20.特殊a串数列求和

给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。

#include "stdio.h"
#include "math.h"
int main()
{
    int a,n;
    int num=0;
    int sum = 0;
    scanf("%d %d",&a,&n);
    for (int i=1;i<=n;i++){   
        num=num+pow(10,i-1)*a;
        sum+=num;
    }
    printf("s = %d",sum);
    return 0;
    
}

21.求奇数和

#include"stdio.h"
int main()
{
    int num,sum=0;
    for (int i=1; ;i++){
       scanf("%d",&num);
       if(num<=0){
            break;
       }
       if(num%2!=0){
           sum+=num;
       }    
    }
    printf("%d",sum);
    return 0;
}

22.水仙花数

题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数
本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

#include <stdio.h>
int main()
{
int i,j,k,n;
printf("'water flower'number is:");
for(n=100;n<1000;n++)
  {
  i=n/100;
  j=(n-i*100)/10;
  k=n%10;
  if(i*i*i+j*j*j+k*k*k==n)
    printf("%d\n",n);
  }
}

## 23.时间换算
本题要求编写程序,以hh:mm:ss的格式输出某给定时间再过n秒后的时间值(超过23:59:59就从0点开始计时)
(ps:题目还算比较友善)

#include<stdio.h>
int main(void){
    int a,b,c;
    int k;
    
    scanf("%d:%d:%d\n",&a,&b,&c);
    scanf("%d",&k);
    c=k+c;
    if(c>=60){
        c=c-60;
        b=b+1;
        if(b>=60){
            b=b-60;
            a=a+1;
            if(a>=24)
                a=a-24;
        }
    } 
    printf("%02d:%02d:%02d",a,b,c);
    
    return 0;    
}

24.读这段代码的结果

程序源代码:
#include <stdio.h>
#define M 5
int main()
{
int a[M]={1,2,3,4,5};
int i,j,t;
i=0;j=M-1;  
while(i<j)
{t=*(a+i);
*(a+i)=*(a+j);
*(a+j)=t;      //指针相互传参
i++;j--;
}
for(i=0;i<m;i++)
printf("%d",*(a+i));

return 0;
}

input结果为:
54321

25.static定义静态变量的用法 (观察即可)

本题以看和了解为主
在定义变量的时候,在数据类型名之前添加static关键字,定义的变量就是静态变量。那么,可以包括“静态局部变量”和“静态全局变量”。

#include <stdio.h>
void varfunc()
{
    int var = 0;
    static int static_var = 0;
    printf("\40:var equal %d \n", var);
    printf("\40:static var equal %d \n", static_var);
    printf("\n");
    var++;
    static_var++;
}
void main()
{
    int i;
    for (i = 0; i < 3; i++)
        varfunc();

    return;
}

输出结果:
图片.png

26.学习使用auto定义变量的用法(观察即可)

auto函数:

#include <stdio.h>
int main()
{
    int i, num;
    num = 2;
    for (i = 0; i < 3; i++)
    {
        printf("\40: The num equal %d \n", num);
        num++;
        {
            auto  num = 1;
            printf("\40: The internal block num equal %d \n", num);
            num++;
        }
    }

    return 0;

}

运行结果:
图片.png

27.小球下落问题

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

#include <stdio.h>
#include<math.h>

int main()
{
    float high = 100;  //总高度
    float s, h;    //h代表当前高度,s代表总长度

    h = high * pow(0.5, 10); //0.5是这个里面的规律,一半,10代表十次
    s = 2 * (50 - h * 0.5 * 2) / (1 - 0.5) + 100;
    printf("第十次的高度为%f;总路程为%f", h, s);

    return 0;
}

28.找出1000以内所有完数

一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。

#include<stdio.h>//头文件 
int main()//主函数 
{
  int number,s,i;//定义变量 
  for(number=2;number<1000;number++)//for循环 
  {
    //直接从2开始
    s=0;
    for(i=1;i<number;i++)
    {
      //检查i是否是m的因子 
      if((number%i)==0)
      { 
      //如果是的话 
        s=s+i;
      } 
      }
    if(s==number)
    {
      printf("%d的因子为:",number);
      for(i=1;i<number;i++)
      { 
        if(number%i==0)
        { 
          //判断是否是因子,是的话就输出 
          printf("%d ",i);
        }
      } 
        printf("\n");//换行 
      }
    }
  return 0;//主函数返回值为0 
}

29.猜数字

#include "time.h"
#include "stdlib.h"
#include "stdio.h"
main()
{char c;
clock_t start,end;
time_t a,b;
double var;
int i,guess;
srand(time(NULL));
printf("do you want to play it.('y' or 'n') \n");
loop:
while((c=getchar())=='y')
{
i=rand()%100;
printf("\nplease input number you guess:\n");
start=clock();
a=time(NULL);
scanf("%d",&guess);
while(guess!=i)
{if(guess>i)
{printf("please input a little smaller.\n");
scanf("%d",&guess);}
else
{printf("please input a little bigger.\n");
scanf("%d",&guess);}
}
end=clock();
b=time(NULL);
printf("\1: It took you %6.3f seconds\n",var=(double)(end-start)/18.2);
printf("\1: it took you %6.3f seconds\n\n",difftime(b,a));
if(var<15)
printf("\1\1 You are very clever! \1\1\n\n");
else if(var<25)
printf("\1\1 you are normal! \1\1\n\n");
else
printf("\1\1 you are stupid! \1\1\n\n");
printf("\1\1 Congradulations \1\1\n\n");
printf("The number you guess is %d",i);
}
printf("\ndo you want to try it again?(\"yy\".or.\"n\")\n");
if((c=getch())=='y')
goto loop;
}

30.(第一个项目)通讯录设计

坦白的说自己做的不太好(因为对于指针一类熟悉度不高),这里从网上引用了一个别人的,自己修改了一下。里面设计很多指针的应用,谢谢这位作者的代码。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
typedef struct student     //定义结构体
{
    char name[20];    //姓名
    char num[15];      //学号
    char sex[10];     //性别
    char from[20];    //籍贯
    char political[10];    //政治面貌
    char phone[15];      //手机号
    char QQ[15];         //QQ号
    char dorm[10];     //宿舍
    struct student* next;  //结构体指针
}stu;
stu* head;

void print()    //主菜单
{
    system("cls");
    printf("\n\n\n");
    printf("      ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
    printf("      ***********************************************************\n");
    printf("      \t\t\t班级通讯录管理系统\n");
    printf("\n");
    printf("      \t\t1. 输入数据");
    printf("\t\t2. 显示数据\n");
    printf("      \t\t3. 插入数据");
    printf("\t\t4. 删除数据\n");
    printf("      \t\t5. 查看数据");
    printf("\t\t6. 修改数据\n");
    printf("      \t\t7. 保存数据");
    printf("\t\t8. 返回主菜单\n");
    printf("      ***********************************************************\n");
    printf("      ~~~~~退~~~~~~~~~~出~~~~~~~~~~请~~~~~~~~~~按~~~~~~~~~~9~~~~~\n");
    printf("      -----------------------------------------------------------\n\n");
}


void input(stu* p1)    //输入相关数据
{
    printf("姓名:");
    scanf("%s", &p1->name);
    printf("学号:");
    scanf("%s", &p1->num);
    printf("性别:");
    scanf("%s", &p1->sex);
    printf("籍贯:");
    scanf("%s", &p1->from);
    printf("政治面貌:");
    scanf("%s", &p1->political);
    printf("手机号:");
    scanf("%s", &p1->phone);
    printf("QQ号:");
    scanf("%s", &p1->QQ);
    printf("宿舍:");
    scanf("%s", &p1->dorm);
}


stu* inputdata()     //数据输入的函数
{
    stu* p1, * p2;
    int i = 1;
    p1 = (stu*)malloc(sizeof(stu));
    if (p1 != NULL)
    {
        head = p1;
        printf("\n\t\t\t☆☆☆输入数据☆☆☆\n");
        printf("------------------------------------------------------------------\n");
        printf("在姓名处输入“ok”代表输入数据结束\n");
        while (i)
        {
            printf("姓名:");
            scanf("%s", &p1->name);
            if (strcmp(p1->name, "ok") == 0)
            {
                printf("\n输入完毕!\n");
                printf("========================================================================\n");
                i = 0;
                p2->next = NULL;
                free(p1);
                p1 = p2;
            }
            else
            {
                printf("学号:");
                scanf("%s", &p1->num);
                printf("性别:");
                scanf("%s", &p1->sex);
                printf("籍贯:");
                scanf("%s", &p1->from);
                printf("政治面貌:");
                scanf("%s", &p1->political);
                printf("手机号:");
                scanf("%s", &p1->phone);
                printf("QQ号:");
                scanf("%s", &p1->QQ);
                printf("宿舍:");
                scanf("%s", &p1->dorm);
                printf("=====================================\n");
                p2 = p1;
                p1 = (stu*)malloc(sizeof(stu));
                if (p1 != NULL)
                {
                    p2->next = p1;
                }
            }
        }
        return(p1->next);
    }
}


stu* lookdata(stu* p1)     //查看数据的函数
{
    printf("\n\t\t\t☆☆☆显示数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    while (p1 != NULL)
    {
        printf("姓名:%s\n", p1->name);
        printf("学号:%s\t", p1->num);
        printf("性别:%s\t", p1->sex);
        printf("籍贯:%s\t", p1->from);
        printf("政治面貌:%s\t", p1->political);
        printf("手机号:%s\t", p1->phone);
        printf("QQ号:%s\t", p1->QQ);
        printf("宿舍:%s\n", p1->dorm);
        printf("======================================================================\n");
        p1 = p1->next;
    }
    return p1;
}


void insert()      //插入数据
{
    int i;
    char named[20];
    stu* p1, * p2, * p3;
    p1 = head;
    p3 = (stu*)malloc(sizeof(stu));
    p3->next = NULL;
    printf("\n\t\t\t☆☆☆插入数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    printf("请输入插入者的资料:\n");
    input(p3);
    printf("\n插入选项\n");
    printf("1.首位置插入\t2.尾位置插入\t3.前插\n");
    printf("请输入你的选择:");
    scanf("%d", &i);
    switch (i)
    {
    case 1:p3->next = p1;
        head = p3;
        break;
    case 2:while (p1->next != NULL)
    {
        p2 = p1;
        p1 = p1->next;
    }
          p1->next = p3;
          break;
    case 3:printf("请输入姓名(前插):");
        scanf("%s", named);
        while (strcmp(named, p1->name) != 0)
        {
            p2 = p1;
            p1 = p1->next;
        }
        p2->next = p3;
        p3->next = p1;
        break;
    }
    printf("插入成功!\n");
    printf("======================================================================\n");
    return;
}

void deleted()          //删除数据
{
    stu* p1, * p2;
    char Name[20];  //想要删除的人的姓名
    printf("\n\t\t\t☆☆☆删除数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    printf("请输入要删除的姓名:");
    scanf("%s", Name);
    p1 = head;
    if (head == NULL)
    {
        printf("内存空空神马都没有!\n");
        printf("======================================================================\n");
        return;
    }
    if (strcmp(Name, p1->name) == 0)
    {
        head = p1->next;
        printf("删除成功!\n");
        printf("======================================================================\n");
        return;
    }
    while (p1 != NULL && (strcmp(Name, p1->name) != 0))
    {
        p2 = p1;
        p1 = p1->next;
    }
    if (p1 == NULL)
    {
        printf("此人不存在!\n");
        printf("======================================================================\n");
        return;
    }
    if (p1->next != NULL)
    {
        p1 = p1->next;
        p2->next = p1;
        printf("删除成功!\n");
        printf("======================================================================\n");
        return;
    }
    else
    {
        p2->next = NULL;
        printf("删除成功!\n");
        printf("======================================================================\n");
        return;
    }
}


void find(stu* p2)        //通过姓名查找查看数据的函数
{
    char name[20];
    int b = 0;
    printf("\n\t\t\t☆☆☆查看数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    printf("请输入您想查找人的姓名:");
    scanf("%s", name);
    while (p2 != NULL)
    {
        if (strcmp(name, p2->name) == 0)
        {
            printf("你要找到的数据\n");
            printf("姓名:%s\n", p2->name);
            printf("学号:%s\t", p2->num);
            printf("性别:%s\t", p2->sex);
            printf("籍贯:%s\t", p2->from);
            printf("政治面貌:%s\t", p2->political);
            printf("手机号:%s\t", p2->phone);
            printf("QQ号:%s\t", p2->QQ);
            printf("宿舍:%s\n", p2->dorm);
            printf("======================================================================\n");
            b = 1;
        }
        p2 = p2->next;
    }
    if (b == 0)
    {
        printf("\n您要查找的人不存在!\n");
    }
}


void update(stu* p2)   //通过姓名查找修改数据
{
    char name[20];
    int b = 0, i;
    printf("\n\t\t\t☆☆☆修改数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    printf("请输入将要修改人的姓名:");
    scanf("%s", name);
    while (p2 != NULL)
    {
        if (strcmp(name, p2->name) == 0)
        {
            printf("该同学的基本信息\n");
            printf("姓名:%s\n", p2->name);
            printf("学号:%s\t", p2->num);
            printf("性别:%s\t", p2->sex);
            printf("籍贯:%s\t", p2->from);
            printf("政治面貌:%s\t", p2->political);
            printf("手机号:%s\t", p2->phone);
            printf("QQ号:%s\t", p2->QQ);
            printf("宿舍:%s\n", p2->dorm);
            printf("\n请选择要修改的信息\n");
            printf("\t1.姓名\t2.学号\t3.性别\t4.籍贯\n\t5.政治面貌\t6.手机号\t7.QQ\t8.宿舍\n");
            printf("\n您的选择是(1~8):");
            scanf("%d", &i);
            printf("请输入修改之后的内容\n");
            switch (i)
            {
            case 1:printf("姓名:");
                scanf("%s", &p2->name);
                break;
            case 2:printf("学号:");
                scanf("%s", &p2->num);
                break;
            case 3:printf("性别:");
                scanf("%s", &p2->sex);
                break;
            case 4:printf("籍贯:");
                scanf("%s", &p2->from);
                break;
            case 5:printf("政治面貌:");
                scanf("%s", &p2->political);
                break;
            case 6:printf("手机号:");
                scanf("%s", &p2->phone);
                break;
            case 7:printf("QQ:");
                scanf("%s", &p2->QQ);
                break;
            case 8:printf("宿舍:");
                scanf("%d", &p2->dorm);
                break;
            }
            printf("\n修改成功!\n");
            printf("=========================================================================\n");
            b = 1;
        }
        p2 = p2->next;
    }
    if (b == 0)
    {
        printf("没有找到该人的资料!\n");
    }
}


void save(stu* p2)   //保存数据
{
    FILE* fp;
    char file[15];
    printf("\n\t\t\t☆☆☆保存数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    printf("输入文件名:");
    scanf("%s", file);
    if ((fp = fopen(file, "w")) == NULL)
    {
        printf("cannot open this file\n");
        exit(0);
    }
    fprintf(fp, "姓名\t学号\t性别\t籍贯\t政治面貌\t手机号\tQQ号\t宿舍\n");
    while (p2 != NULL)
    {
        fprintf(fp, "%s\t", p2->name);
        fprintf(fp, "%s\t", p2->num);
        fprintf(fp, "%s\t", p2->sex);
        fprintf(fp, "%s\t", p2->from);
        fprintf(fp, "%s\t", p2->political);
        fprintf(fp, "%s\t", p2->phone);
        fprintf(fp, "%s\t", p2->QQ);
        fprintf(fp, "%s\n", p2->dorm);
        p2 = p2->next;
    }
    printf("\n保存成功!\n");
    printf("======================================================================\n");
    fclose(fp);
}


void screen()
{
    int i;
    char s[251] = { "欢迎使用由ZM制作班级通讯录管理系统,\n\n\t\t\t本系统用于通讯录管理----排序,打印\n\n\n\t\tWelcome to use produced by ZM class address book\n\n\t\t management system,sorting,printing" };

    printf("\n================================================================================\n");
    printf("\n\n\n\t\t\t");
    for (i = 0; s[i] != NULL; i++)
    {
        Sleep(30);
        printf("%c", s[i]);
    }
    printf("\n\n\n\n\n\n\n\n\t\t ~ Hi~ o(* ̄▽ ̄*)ブ~ ~ ~祝您旅途愉快~ ~\n");
    printf("================================================================================\n");

}


void main()
{
    int i;
    system("color 4e");
    screen();
    Sleep(3000);
    print();
    while (1)
    {
        printf("请输入你的选择(1~9):");
    loop:scanf("%d", &i);
        if (i < 1 || i>9)
        {
            printf("输入有误,请在1~9中进行选择:");
            goto loop;
        }
        switch (i)
        {
        case 1:
            inputdata();
            break;
        case 2:
            lookdata(head);
            break;
        case 3:
            insert();
            break;
        case 4:
            deleted();
            break;
        case 5:
            find(head);
            break;
        case 6:
            update(head);
            break;
        case 7:
            save(head);
            break;
        case 8:
            print();
            break;
        case 9:
            exit(1);
            break;
        }
    }
}

31.求两个数组的和

已知一个数组a[5]={1,2,3,4,5}、b[5]={11,4,2,7,9}数组c[5]等于数组a、b对应元素之和。输出数组c中个元素的值。

#include<stdio.h>
`
int main()`
{
    int a[5] = { 1,2,3,4,5 };
    int b[5] = { 11,4,2,7,9 };
    int c[5];
    int i;
    for (i = 0; i < 5; i++)
    {
        c[i] = a[i] + b[i];

        printf("%d\n", c[i]);
    }

    return 0;
}

32.自定义函数逆序数组

写一个函数void change(int array[],int n),可以将数组array中的n个元素逆序存放。即array[0]与a[n-1]互换,array[1]与array[n-2]互换……。

void change(int array[], int n)
{
    int i, temp;   //i在数组内,temp负责交换
    for (i = 0; i < n / 2; i++)
    {
        temp = array[i];
        array[i] = array[n - i - 1];
        array[n - i - 1] = temp;
    }
    for (i = 0; i < n; i++)
        printf("%4d", array[i]);
}

33.求两个矩阵的乘积c。已知矩阵a、b的值

#include<bits/stdc++.h>
using namespace std;

int main(){
    int a,b,c;
    cout<<"请输入两矩阵的行列:"<<endl;
    cin>>a>>b>>c;                           //分别录入第一个矩阵的行,两矩阵共同行列,第二个矩阵的列
    int X[a][b],Y[b][c],Z[a][c];            //开辟三个二维数组存储矩阵,注意相乘结果的行列值
    cout<<"请输入第一个矩阵:"<<endl;
    for(int i=0;i<a;i++){                   //矩阵的行
        for(int j=0;j<b;j++){               //矩阵的列
            cin>>X[i][j];
        }
    }
    cout<<"请输入第二个矩阵:"<<endl;
    for(int i=0;i<b;i++){                   //矩阵的行
        for(int j=0;j<c;j++){               //矩阵的列
            cin>>Y[i][j];
        }
    }
    memset(Z,0,sizeof(Z));          //将二维数组Z初始化为0
    //int temp=0;
    cout<<"矩阵相乘的结果为:"<<endl;
    for(int i=0;i<a;i++){
        for(int j=0;j<c;j++){
            for(int k=0;k<b;k++){
                Z[i][j]=Z[i][j]+X[i][k]*Y[k][j];      //行与列的乘积和为相应结果值
                //temp=temp+X[i][k]*Y[k][j];
            }
            cout<<Z[i][j]<<" ";                  //计算完一个后输出      
            //cout<<temp<<" ";
            //temp=0;
        }
        cout<<endl;                   //计算完一列后输出换行

    }
    return 0;
}

34.应用数组实现输入年year、月month、日date,计算该日期是这年的第几天。

要求:定义二维数组求总天数

#include<stdio.h>
int day_of_year(int year, int month, int day);  //自定义函数
int main()
{
    int year, month, day;
    scanf("%d %d %d", &year, &month, &day);
    printf("%d", (day_of_year(year, month, day)));
    return 0;
}
int day_of_year(int year, int month, int day)

    int i, leap;   //i指输入月份-1,其他月的天数遍历,leap根据闰年平年切换一维二维
    int tab[2][13] = {
        {0,31,28,31,30,31,30,31,31,30,31,30,31},//非 
        {0,31,29,31,30,31,30,31,31,30,31,30,31}//闰年 
    };
    leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);//1为闰年 0为非 
    for (i = 1; i < month; i++) {
        day += tab[leap][i];
    }


    return day;
}

35.按照平均成绩从高到低的顺序输出学号和平均分。

提示:对平均分排序,当元素互换时,学号元素对应互换。

思路:冒泡排序,冒泡排序算法样例如下:

#include <stdio.h>
int main()
{
    int i,j,t,a[11];    //定义变量及数组为基本整型
    printf("请输入10个数:\n");
    for(i=1;i<11;i++)
        scanf("%d",&a[i]);    //从键盘中输入10个数
    for(i=1;i<10;i++)    //变量i代表比较的趟数
        for(j=1;j<11-i;j++)    //变最j代表每趟两两比较的次数
            if(a[j]>a[j+1])
            {
                t=a[j];    //产利用中间变童实现两值互换
                a[j]=a[j+1];
                a[j+1]=t;
            }
            printf("排序后的顺序是:\n");
            for(i=1;i<=10;i++)
                printf("%5d",a[i]);    //将胃泡排序后的顺序输出
        printf("\n");
    return 0;
}

本代码及gif动画分别引用自:

https://www.runoob.com/w3cnot...
http://c.biancheng.net/view/5...

因此
本题代码为:

#include<stdio.h>
struct student
{
    int num;  //学号
    char name[20];   //姓名
    float score;     //分数
};  //先构造结构体,把需要的东西放一起,方便同时排序调换
int main()
{

    struct student stu[5] = { { 17,"keen",97.5 }, { 18,"tom",59 }, { 19,"wangli",31 }, { 20,"lihua",54 }, { 21,"yuzhou",98 }
    };
    struct student t;
    int i, j, k;
    printf("成绩由大到小的顺序:\n");
    for (i = 0; i < 4; i++)   //代表的比较趟数
    {
        k = i;
        for (j = i + 1; j < 5; j++)
        {
            if (stu[j].score > stu[k].score)
            {
                k = j;
            }
            t = stu[k];
            stu[k] = stu[i];
            stu[i] = t;
        }
        for (i = 0; i < 5; i++)//循环输出5个人的成绩 
        {
            printf("%d,%10s,%6.2f分\n", stu[i].num, stu[i].name, stu[i].score);//输出结果 
        }
        return 0;//主函数返回值为0 

    }
}

36.编写一个函数,实现str中的字符的互换。如”abcde”换成”edcba”。

关于数组逆序的几种做法

1.非递归做法

已有字符串逆序

#include <stdio.h>
int main()
{
    char arr[] = "abcdef";
    int sz = sizeof(arr) / sizeof(arr[0]); //求的是数组包含的元素个数,'\0'也包括在内
    int left = 0;
    int right = sz - 2;   //减2是因为求得的sz包含了'\0'这个元素。
    while (left < right)
    {
        char tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
    }
    printf("%s", arr);
    return 0;
}

自己输入逆序

#include <stdio.h>
#include <string.h>
int main()
{
    char arr[101] = { 0 };     //要给字符数组一定的内存大小,如果写成char arr[] = { 0 };,当在给数组输入的时候就会造成越界访问。
    scanf("%s", arr);
    int sz = strlen(arr);    //在给定字符数组的大小为101的情况下,只能用strlen求输入字符串长度。
                           //用sizeof(arr)/sizeof(arr[0])求出来的是数组大小,为101。
    int left = 0;
    int right = sz - 1;
    while (left < right)
    {
        char tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
    }
    printf("%s", arr);
    return 0;
}

封装成函数

#include <stdio.h>
#include <string.h>
void reverse(char arr[])
{
    
    int left = 0;
    int right = strlen(arr) - 1;      //封装成函数只能用库函数求字符串长度,不能用sizeof(arr)/sizeof(arr[0])-1这种方式。
                                    //因为数组形参就是个地址。sizeof(arr)与sizeof(arr[0])的大小都是四个字节或者八个字节。
    while (left < right)
    {
        char tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
    }
}
int main()
{
    char arr[] = "abcdef";
    reverse(arr);
    printf("%s", arr);
    return 0;
}

2.递归做法

#include <stdio.h>
#include <string.h>
void reverse(char str[], int left, int right)
{
    if (left < right)
    {
        char tmp = str[left];
        str[left] = str[right];
        str[right] = tmp;
        reverse(str, left + 1, right - 1);
    }

}
int main()
{
    char arr[101] = { 0 };
    scanf("%s", arr);
    int left = 0;
    int right = strlen(arr) - 1;
    reverse(arr, left, right);
    printf("%s\n", arr);
    return 0;
}

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上的输出结果:
图片.png

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;
    
}

输出结果:
图片.png

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[i])
            max = &a[i];
        if (*min > a[i])
            min = &a[i];
    }
    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[i]==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[i]=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[i]=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[i]=a[i-1]+i;
        sum=0;
        for(i=0;i<=6;i++)
            sum+=a[i];
        if(sum==105)
        {
            for(i=0;i<=6;i++)
                printf("%d ",a[i]);
            printf("\n");
        }
    }
    return 0;
}

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

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

#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;
}

输出截图:
图片.png

46.百万富翁问题

一个百万富翁遇到一个陌生人,陌生人找他谈一个换钱的计划,该计划如下:我每天给你十万元,而你第一天只需给我一分钱;第二天我仍给你十万元,你给我两分钱;第三天我仍给你十万元,你给我四分钱;…,你每天给我的钱是前一天的两倍,直到满一个月(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运行结果:
图片.png

47.如果整数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;
}

48.一数三平方

在【100000,999999】范围内找出符合以下条件的数并输出:

  1. 该数本身是一个平方数
  2. 该数的前3位也是一个平方数
  3. 该数的后3位也是一个平方数
#include <stdio.h>
#include <math.h>

int main()
{
    int i, num0, num1, num2;
    for (i = 100000; i < 999999; i++)  //范围确定
    {
        num0 = (int)sqrt(i);       //平方根,int强制整型
        num1 = (int)sqrt(i / 1000);
        num2 = (int)sqrt(i % 1000);
        if (num0 * num0 == i && num1 * num1 == i / 1000 && num2 * num2 == i % 1000)  //如果这些条件都满足
            printf("%d\n", i);
    }
    return 0;
}

49.简化的插入排序

图片.png

#include<stdio.h>
main()
{
    int N, X, i, t, k, j;
    scanf("%d", &N);
    
        for (i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);
    }
    scanf("%d", &X);
    N += 1;
    a[N - 1] = X;
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N - i - 1; j++)
            if (a[j] > a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
    }
    for (i = 0; i < N; i++)
        printf("%d ", a[i]);
    return 0;
}

50.求最大值及其下标

#include <stdio.h>
#define N 10
int main()
{
    int i, n, max;
    int index = 0;
    int arr[N];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    max = arr[0];
    for (i = 1; i < n; i++)
    {
        if (max < arr[i])
        {
            max = arr[i];
            index = i;
        }
    }
    printf("%d %d\n", arr[index], index);
    return 0;
}

51.将数组中的数逆序存放

设定10个数值的数组

#include<stdio.h>
#define N 10
int main()
{
    int i, n;
    int temp;
    int arr[N];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    for (i = 0; i < n / 2; i++)
    {
        temp = arr[i];
        arr[i] = arr[n - i - 1];
        arr[n - i - 1] = temp;

    }
    for (i = 0; i < n; i++)
    {
        printf(" %d", arr[i]); //因为行末尾不能有空格
    }
    return 0;
}

52.找出不是两个数组共有的元素

输入样例:

10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1
#include <stdio.h>
int main()
{
    int n1, n2;
    int a[20], b[20], i, j;  //分别遍历a,b两个数组

    scanf("%d", &n1);

    for (i = 0; i < n1; i++)
    {
        scanf("%d", &a[i]);
    }
    scanf("%d", &n2);
    for (j = 0; j < n2; j++)
    {
        scanf("%d", &a[j]);
    }

    //两个数组带入输入
    int c[40] = { 0 };
    int flag = 1;
    int mark;
    int k;


    for (i = 0; i < n1; i++)
    {
        flag = 1;
        for (j = 0; j < n2; j++)
        {
            if (a[i] = b[j])
            {
                flag = 0;
                break;
            }
        }
        if (flag == 1)
        {
            c[mark] == b[j];
            mark++;
        }
    }
    for (i = 0; i < mark; i++)
    {
        for (j = i + 1; j < mark; j++)
        {
            if (c[j] == c[i])
            {
                for (k = j; k < mark - 1; k++)
                {
                    c[k] = c[k + 1];
                }
                mark--;
                j--;
            }
        }
    }

    //完成筛查c[]重复的数

    printf("%d", c[0]);
    for (i = 1; i < mark; i++) {
        printf(" %d", c[i]);
    }
    return 0;
}


53.凯撒密码

为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。

它又叫循环移位密码.它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代.它的加密过程可以表示为下面的函数:
E(m)=(m+k) mod n
其中:m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数.
例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的
密文为L:
E(8) = (m+k) mod n = (8+4) mod 26 = 12 = L

#include <stdio.h>
#include <string.h>

int main()
{
    char password[100];
    int i, move, tmp;
    printf("加密选择1,解密选择2");
    scanf("%d", &tmp);
    switch (tmp)
    {
    case(1):               //加密
        printf("输入原文:");
        scanf("%s", &password);
        printf("自定义密钥");
        scanf("%d", &move);
        for (i = 0; i < strlen(password); i++)
        {
            if (password[i] >= 'A' && password[i] <= 'Z')
            {
                password[i] = ((password[i] - 'A') + move) % 26 + 'A';
            }
            else if (password[i] >= 'a' && password[i] <= 'z')
            {
                password[i] = ((password[i] - 'a') + move) % 26 + 'a';
            }
        }
        printf("加密后的密文");
        printf("%s\n", password);
        break;
    case(2):                            //解密
    {
        printf("输入密文:");
        scanf("%s", &password);
        printf("密匙为(1-25):");
        scanf("%d", &move);
        for (i = 0; i < strlen(password); i++)
        {
            if (password[i] >= 'A' && password[i] <= 'Z')
            {
                password[i] = ((password[i] - 'A') + 26 - move) % 26 + 'A';
            }
            else if (password[i] >= 'a' && password[i] <= 'z')
            {
                password[i] = ((password[i] - 'a') + 26 - move) % 26 + 'a';
            }
        }
        printf("解密后的原文");
        printf("%s\n", password);
    }

    default:
        break;
    }

    return 0;
}

54.数字加密

输入一个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将千位和十位上的数字互换,百位和个位上的数字互换,组成加密后的新四位数。例如输入1257,经过加9取余后得到新数字0146,再经过两次换位后得到4601。

输入格式:
输入在一行中给出一个四位的整数x,即要求被加密的数。

输出格式:
在一行中按照格式“The encrypted number is V”输出加密后得到的新数V。

输入样例:
1257

输出样例:
The encrypted number is 4601

#include <stdio.h>

int main()
{
    int a[4];   //原始数组
    int i;     //循环遍历数
    int input;//input number
    int temp; //交换
    printf("输入一个四位数");
    scanf("%d", input);
    // 每个数分离出来
    for (i = 4; i >= 1; i--)
    {
        a[i] = input % 10;
        input = input / 10;
    }
    //将该数每一位上的数字加9,然后除以10取余
    for (i = 0; i <= 4; i++)
    {
        a[i] = a[i] + 9;
    }
    for (i = 0; i <= 4; i++)
    {
        a[i] = a[i] % 10;
    }
    //千位和十位上的数字互换
    for (i = 0; i < 2; i++)
    {
        temp = a[i];
        a[i] = a[i + 2];
        a[i + 2] = temp;
    }
    printf("The encrypted number is ");
    for (i = 0; i < 4; i++)
    {
        printf("%d", a[i]);
    }
    return 0;
}

55.平面向量加法

本题要求编写程序,计算两个二维平面向量的和向量。

输入格式:
输入在一行中按照“x1 y1 x2 y2”的格式给出两个二维平面向量v1=(x1,y1)和v2=(x2,y2)的分量。
 
输出格式:
在一行中按照(x, y)的格式输出和向量,坐标输出小数点后一位(注意不能输出−0.0)。
 
输入样例:
3.5 -2.7 -13.9 8.7
 
输出样例:
(-10.4, 6.0)

代码如下:

#include <stdio.h>
int main(){
    double x1,x2,y1,y2,x,y;
    scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
    x=x1+x2;y=y1+y2;
    if(x>-0.05&&x<0){
        x=0.0;
    }
    if(y>-0.05&&y<0){
        y=0.0;
    }
    printf("(%1.1f, %1.1f)",x,y);
    return 0;
}

56.查找书籍

给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价。

输入格式:
输入第一行给出正整数n(<10),随后给出n本书的信息。每本书在一行中给出书名,即长度不超过30的字符串,随后一行中给出正实数价格。题目保证没有同样价格的书。

输出格式:
在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书。价格保留2位小数。

输入样例:
3
Programming in C
21.5
Programming in VB
18.5
Programming in Delphi
25.0

完整代码如下:

#include <stdio.h>
#include<string.h>
#include<windows.h>

struct book
{
    char name[65];
    float price;
}books[10];
int input(int n)
{
    for (int i = 0; i < n; i++)
    {
        gets_s(books[i].name);
        scanf("%f", &books[i].price);
        system("pause");
    }
}
int main()
{
    int n, i;
    scanf("%d", &n);
    getchar();
    input(n);
    int min, max=0;
    for (i = 1; i < n; i++)
    {
        if (books[i].price < books[min].price)
            min = i;
        if (books[i].price > books[max].price)
            max = i;
    }
    printf("%.2f, %s\n", books[max].cost, books[max].name);
    printf("%.2f, %s", books[min].cost, books[min].name);

    return 0;

}

57.求一批整数中出现最多的个位数字

给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。
输入格式:

输入在第1行中给出正整数N(≤),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。
输出格式:

在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n1、n2、……为出现次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。

输入样例:

3
1234 2345 3456

 
输出样例:

3: 3 4
#include<stdio.h>

int main(void)
{
    int i, n; //i每一次,n总次数
    int number;   //输入这批数字
    int index;
    int a[10] = { 0 };
    int sum; //对比
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &number);
        while (number)
        {
            index = number % 10;
            a[index]++;
            number = number / 10;

        }
    }
    sum = 0;
    for (i = 0; i < 10; i++)
    {
        if (a[i] > sum)
        {
            sum = a[i];
            printf("%d", sum);
            for (i = 0; i < 10; i++)
                if (sum == a[i])
                    printf("%d", &i);

            return 0;
        }
    }

}

58.使用函数求特殊a串数列和

给定两个均不超过9的正整数a和n,要求编写函数求a+aa+aaa++⋯+aa⋯a(n个a)之和。

#include <stdio.h>

int fn(int a, int n);
int SumA(int a, int n);
int main()
{
    int a, n;

    scanf("%d %d", &a, &n);
    printf("fn(%d, %d) = %d\n", a, n, fn(a, n));
    printf("s = %d\n", SumA(a, n));

    return 0;
}

int fn(int a, int n)  //fn须返回的是n个a组成的数字
{
    int sum1 = 0;
    int i = 0;
    for (int i = 0; i < n; i++)
    {
        sum1 = 10 * sum1 + a;
        
    }
    return sum1;
}
int SumA(int a, int n)//SumA返回要求的和
{
    int sum2 = 0;//总和
    int j = 0; //j当前循环次数的和
    int k = 0;  //a为数,n为次数,k为配合n
    for (int k = 0; k < n; k++)
    {
        j = 10 * j + a;
        sum2 += j;
    }
    return sum2;
}


59.选择法排序

输入格式:

输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:

在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。

思路:
给定一个数,这个数就是数组的大小
第二行输入的数在数组里放置
设定一个变量(用于比较用),两两交换,最后输出

#include <stdio.h>
int main()
{
    int a[10];
    int i, n;
    int temp;
    int j;//用于两两比较

    scanf("%d\n", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    for (i = 0; i < n; i++)
    {
        for (j = n - 1; j > i; j--)
        {
            if (a[j] > a[i])
            {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;

            }
        }
    }
    for (i = 0; i < n; i++)
        printf("%d", a[i]);
    return 0;
}

60. 找鞍点

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:

输入第一行给出一个正整数n(1)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:

输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:

4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9

 
输出样例1:

2 1

 
输入样例2:

2
1 7
4 1

 
输出样例2:

NONE

完整代码如下:

#include <stdio.h>

int main()
{
    int a[10][10];
    int i, j;
    int n;     //希望的数组大小,输入
    int max;//定义该行最大值
    int min;//定义该列最小值
    int point1;//横坐标
    int point2;//纵坐标
    int sign;//标志数
    int k;//比较最小时用



    scanf("%d", &n); //数组大小输入
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
    for (i = 0; i < n; i++)
    {
        max = a[i][0];
        point1 = i;
        point2 = 0;
        sign = 1;
        for (j = 0; j < n; j++)
        {
            if (a[i][j] >= max)
                max = a[i][j];
            point1 = i;
            point2 = j;

        }
        min = max;
        for (k = 0; k < n; k++)
        {
            if (a[k][point2] < min)
            {
                sign = 0;
                break;
            }
        }
    }
    if (sign == 1)
        printf("%d %d,point1,point2");
    else
        printf("NONE");
    return 0;


}

61.使用函数验证哥德巴赫猜想

任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
int prime( int p );
void Goldbach( int n );

其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数Goldbach按照格式“n=p+q”输出n的素数分解,其中p≤q均为素数。又因为这样的分解不唯一(例如24可以分解为5+19,还可以分解为7+17),要求必须输出所有解中p最小的解。

#include <stdio.h>
#include <math.h>

int prime( int p );
void Goldbach( int n );

int main()
{
    int m, n, i, cnt;

    scanf("%d %d", &m, &n);
    if ( prime(m) != 0 ) printf("%d is a prime number\n", m);
    if ( m < 6 ) m = 6;
    if ( m%2 ) m++;
    cnt = 0;
    for( i=m; i<=n; i+=2 ) {
        Goldbach(i);
        cnt++;
        if ( cnt%5 ) printf(", ");
        else printf("\n");
    }

    return 0;
}

/* 你的代码将被嵌在这里 */

插入函数部分:

#include<stdio.h>

int prime(int p)
{
    int i;
    if (p == 1) {
        return 0;
    }
    else if (p == 2)
    {
        return 1;
    }
    else {
        for (i = 2; i < p; i++) {
            if (p % i == 0)
                return 0;
        }
    }
    return 1;

}
void Goldbach(int n)
{
    int a;
    int count = 0;
    for (a = 2; a <= n; a++) {
        if (prime(a) == 1 && prime(n - a) == 1) {
            printf("%d=%d+%d", n, a, n - a);
            break;
        }
    }

}

62.判断上三角矩阵

上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。

本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
输入格式:
输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:

每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。

输入样例:

2
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2

 
输出样例:

YES
NO

完整代码如下:

#include<stdio.h>
int main(void)
{
    int T;
    int i;
    int j, k;
    int a[10][10];
    int n;

    scanf("%d", &T);
    for (i = 0; i < T; i++)
    {
        scanf("%d", &n);
        int sign = 1;
        for (j = 0; j < n; j++)
        {
            for (k = 0; k < n; k++)
            {
                scanf("%d", &a[j][k]);
                if (j > k)
                {
                    if (a[j][k] != 0)
                        sign = 0;
                }
            }
        }

if (sign)
printf("YES\n");
else
printf("NO\n");
    }

    return 0;
}

63.ip地址转换

一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。

输入格式:
输入在一行中给出32位二进制字符串。

输出格式:
在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。

输入样例:
11001100100101000001010101110010

输出样例:
204.148.21.114

#include<stdio.h>
int main()
{
    char ip[32] = "192.168.1.151"; //ip值
    char address[32] = ""; //存储字符串ip
    unsigned int ipaddress = 0;   //存储整型ip
    int fenge[4] = { 0 };
    int i = 0;
    sscanf(ip, "%d.%d.%d.%d", &fenge[0], &fenge[1], &fenge[2], &fenge[3]);
    for (i = 0; i < 4; i++)
    {
        ipaddress += (fenge[i] << (24 - (i * 8)) & 0xFFFFFFFF);

    }
    printf("整型ip:%u\r\n", ipaddress);
    sprintf(address, "%d.%d.%d.%d", ipaddress>> 24, (ipaddress & 0xFF0000) >> 16, (ipaddress & 0xFF00) >> 8, ipaddress & 0xFF);
    //输出
    printf("字符串IP:%s\r\n", address);

    return 0;
}

64.括弧匹配检验

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错误的匹配。

现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?

输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK” ,不匹配就输出“Wrong”。输入一个字符串:[([][])],输出:OK。

#include<stdio.h>
#include<stdlib.h>
char stack[256];

int main()
{
    int top = 0;
    char str[256];
    gets_s(str);
    int i = 0;
    while (str[i] != '\0')
    {
        if (str[i] == '(' || str[i] == '[');
        {
            stack[++top] == str[i];
        }
        else if (str[i] == ')' || str[i] == ']')
        {
            if ((str[i] == ')' && stack[top] == '(') || (str[i] == ']' && stack[top] == '['))
            {
                top--;
            }
            else
            {
                printf("wrong");
                return 0;
            }
        }
        i++;
    }
    if (top == 0)
    {
        printf("ok");
    }
    else
    {
        printf("wrong");
    }
    return 0;
}

65.求最大公约数

#include <stdio.h>
//函数声明
int gcd(int a, int b);  //也可以写作 int gcd(int, int);
int main(){
    printf("The greatest common divisor is %d\n", gcd(100, 60));
    return 0;
}
//函数定义
int gcd(int a, int b){
    //若a<b,那么交换两变量的值
    if(a < b){
        int temp1 = a;  //块级变量
        a = b;
        b = temp1;
    }
   
    //求最大公约数
    while(b!=0){
        int temp2 = b;  //块级变量
        b = a % b;
        a = temp2;
    }
   
    return a;
}

66. 字符串压缩

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

class Solution {
public:
    string compressString(string S) {
        if ((int)S.length() == 0) return S; // 空串处理
        string ans = "";
        int cnt = 1;
        char ch = S[0];
        for (int i = 1; i < (int)S.length(); ++i){
            if (ch == S[i]) cnt++;
            else{
                ans += ch + to_string(cnt); // 注意 cnt 要转为字符串
                ch = S[i];
                cnt = 1;
            }
        }
        ans += ch + to_string(cnt);
        return ans.length() >= S.length() ? S : ans;
    }
};

67.狼类中有一个成员是攻击力 Attacks value 人类中也有一个攻击力Attacks value。由狼类和人类共同的派生类狼人类中,该如何消除二义性,请用代码实现。

#include <iostream>
using namespace std;

class animal
{
public:
    int attack;
};
class wolf :virtual public animal
{
public:
    void wolfmember()
    {
        cout << "狼人攻击" << endl;
    }
};
class people :virtual public animal
{
public:
    void peoplemember()
    {
        cout << "人类攻击" << endl;
    }
};
class wolfman :public wolf, public people
{
public:
    void wolfmanattack()
    {
        cout << "wolfman attack is" << attack << endl;
    }
};
int main()
{
    wolfman keen;  //对狼人下定义
    keen.attack = 10;
    keen.wolfmanattack();

    return 0;
}

68.左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

 

示例 1:

输入: s = "abcdefg", k = 2
输出: "cdefgab"

示例 2:

输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"

 

class Solution {
public:
    string reverseLeftWords(string str,int n){
        if(str.size()==0) return str;
        string s = str.substr(0,n);
        string res = str.substr(n,str.size()-n) + s;
        return res;
    }
};

(持续更新,未完待续)


瞿小凯
1.3k 声望593 粉丝