立创复习篇(c语言的一些例题)

版权声明:请尊重每一个人的劳动成果 https://blog.csdn.net/jamenu/article/details/84844057

以下全是些经典的例题

1.辗转相除求最小公约数和最小公倍数

#include <stdio.h>
int main()
{
	int u,v,t,r,sum;
	
	scanf("%d%d",&u,&v);sum=u*v; //提前求出输入的乘积
	
	if(v>u)  //因为要求余取模,保证前一个数大于下一个数,如果不是就把他们的值互换以下
	{
		t = v;
		
		v = u;
		
		u = t;
	}
	while((r=u%v)!=0) //把求模的余数赋给r,循环相除直到余数为0
	{
		u = v;
		
		v = r;
	}
	
	printf("最小公约数市%d\n",v);  //v结束循环后就是我们的最小公约数
	
	printf("最小公倍数是%d\n",sum/v);	//乘积除以最小公倍数就是最小公倍数
}

下面给出程序的运行截图
在这里插入图片描述这个算法叫做辗转相除法
根据
现在把这个方法写成函数形式

#include <stdio.h>
void zhanzuan(int u,int v);
int main()
{
	int i,j;
	
	printf("请输入数据\n");
	
	scanf("%d%d",&i,&j);
	
	zhanzuan(i,j);
}
void zhanzuan(int u,int v)    //很简单的把算法步骤放入子函数中去就可以了
{
	int sum,r,t;
	
	sum = u*v;
	
	if(v>u)
	{
		t = v;
		
		v = u;
		
		u = t;
	}
	while((r=u%v)!=0)
	{
		u = v;
		
		v = r;
	} 
	printf("最小公倍数是%d\n",v);
	printf("最大公倍数是%d",sum/v);	
	
}

我们再补充一个,谭浩强的C语言设计中的副册中的实验7中的题目中
要用一个函数求最小公约数,另一个求最小公倍数,并在主函数中输出
下面给出代码

#include <stdio.h>
int gongyueshu(int m,int n);   //求
int minestbeishu(int m,int n);
int main()
{
 int n,m;
 printf("请输入m,n");
 scanf("%d%d",&m,&n);
 printf("最小公约数是%d",gongyueshu(m,n));
 printf("最小公倍数是%d",minestbeishu(m,n));
 
 } 
 int gongyueshu(int m,int n)
 {
    int temp,r;
    if(n>m)
    {
       temp = m;
   
        m = n;
   
         n = temp;
     }
    while((r=m%n)!=0)
    {
          m = n;
   
           n = r;
    }
  return n;   //把最小公约数作为返回值返回到主函数
 }
 int minestbeishu(int m,int n)
 {
  int sum,target; //设一个变量作为最小公倍数,
  sum = m*n;
  target = m*n/gongyueshu(m,n);   //因为最小公倍数是M*N除以最小公约数,
  return target;         //返回最小公倍数
  
  
  } 

2. 判断素数即100~200间的素数输出

#include <stdio.h>
int main()
{
	int i,j,k = 1,n;
	
	printf("请输入要判断的数\n");
	
	scanf("%d",&n);
	
	if(n==1)k=0;
	
	for(i=2;i<=n-1;i++)
	{
		if(n%i==0)
		{
			k=0;break;
		}
	}
	if(k)
	{
		printf("是个素数"); 
	}
	else
	{
		printf("不是素数"); 
	}
}

下面把判断奇数写成函数并输出100~200内的素数

#include <stdio.h>
int main()
{
	int i,j;
	
	for(i=100;i<200;i++)
	{
		if(paishuanshusu(i))   //根据调用判断函数的返回值,当返回值为1时为素数,输出i
		{
			printf("%5d",i);   //当然也可以加一个计数变量,控制进行回车,更美观一些
		}
	}
	
}
int paishuanshusu(int n)   //把上面主函数放进子函数中,并返回标记值
{
	int i,flag=1;
	
	if(n==1)flag=0;
	
	for(i=2;i<=n-1;i++)
	{
		if(n%i==0)
		{
			flag =0;break;  //当找到一个i时就退出,不用过多的计算
		}
	}
	
	return (flag);
}

根据素数的性质,不能被除1和自己外的数整除,来循环的相除
我们可以添加一个计数器当到达 一定的输出个数时就回车
我们只需要稍微修改以下主函数

int main()
{
    int i,num=0;   //num为计数器,控制回车换行用
 
    for(i=100;i<200;i++)
    {
         if(puanduan(i))
         {
               printf("%5d",i);num++;
         }
         if(num==5)
         {
               printf("\n");num = 0;
          }
 }
 
}

在这里插入图片描述

3.水仙花问题
水仙花数是指一个数等于它的个位十位百位数的立方之和
下面给出代码

#include <stdio.h>
int main()
{
	int i,j,k,l,n;
	
	for(i=100;i<1000;i++)
	{
		j = i/100;    //找出百位上的数字
		
		k = i%100/10 ;  //找出十位上的数字
		
		l = i%10;     //找出各位上的数字
		
		if(i==j*j*j+k*k*k+l*l*l)  //进行判断
		{
			printf("%5d",i);
		}
	}
}

4.正整数的倒序输出问题
要将一个正整数倒序输出,就和上一题一样,要想办法取出这个正整数的每一个数
下面给出代码

#include <stdio.h>
int main()
{
	int m,r;
	
	printf("请输入一个数");  
	
	scanf("%d",&m);   //输入一个数
	
	do
	{
		r = m%10;   //第一次循环找出个位
		
		printf("%d",r); //输出每一次得到的r
	}while(m/=10);  //每次执行完取模后,将m处以10减少一位,进而第二次循环找到十位数,以此类推,直到m不能除以10时结束循环
	
	printf("\n");
	
	return 0;
}

在这里插入图片描述
5.生兔子问题(斐波那契数列问题)
有一对兔子,3个月后每个月生一对兔子,新生兔子三个月后又生一对兔子。问N的月后兔子总共有多少对。
抽象为为1个数组第3个数开始,每个个时前两个数的和
1 1 2 3 5 8 13 1,1,2,3,5,8,13·······
下面给出代码

#include <stdio.h>
int main()
{
 int f1 = 1,f2 = 1,i,n;
 
 printf("请输入月份\n");
 
 scanf("%d",&n);    //输入月份控制语句
 
 for(i=1;i<=n;i++)
 { 
  printf("%6d%6d\n",f1,f2);  //先输出,在迭代,不能弄反顺序
  f1 = f2+f1;         //每次循环进行一次迭代,f1和f2就会等于前面的值之和
  f2 = f1+f2; 
 }
}

6.a+aa+aaa+aaaa…问题
如2+22+222=246;
每个位数上的数字都是一样的,要注意每一次循环尾数要保持一致,这就需要2个累加值并把他们加起来,
下面放出代码;

#include <stdio.h>
int main()
{
    int tn = 0,sn = 0,a,n,i;   //sn为总的累加数,tn为临时的累加数
 
    printf("请输入a和n\n");
 
    scanf("%d%d",&a,&n);    //控制a和n的条件
 
    for(i=1;i<=n;i++)
    {
         tn+=a;    //形成a aa aaa的情况
  
         sn+=tn;    //sn累加起每个tn进而求出总和
  
         a=a*10;
     }
 
     printf("%d",sn);
}

下面给出运行截图
在这里插入图片描述

7.数字不重复组合次数问题
给定若干个个数字,有多少种不重复的组合
对于少量的数字我们完全可以用穷举法来运算
假定给定1,2,3,4个数字,问有多少个3位数的组合方式
下面给出代码

#include <stdio.h>
int main()
{
 int i,j,k;     //i,j,k分别代表百位,十位,个位的数字   
 
 for(i=1;i<5;i++)
 {
       for(j=1;j<5;j++)
       {
               for(k=1;k<5;k++)   //三重for循环找出所有可能的情况
               {
                       if(i!=j&&j!=k&&i!=k) //使每个位数上的数字不同,避开重复的情况
                      {
                            printf("%d%d%d\n",i,j,k);
                      }
                }
         }
 }
 return 0;
}

8.二维数组的倒置问题
假设有一个a[3][4]的整形数组为

1   2   3   4
5   6   7   8
9  10   11 12

把这个矩阵倒过来形成

1   5   9
2   6   10
3   7   11
4   8   12
#include <stdio.h>
int main()
{
    int i,j,i1,j1,a[101][101],b[101][101];  //定义2个二维数组,有充足的空间
    printf("please input the number of rows(<=100)\n");
    scanf("%d",&i1);                       //输入i1控制行数
    printf("please input the number of columns(<=100)\n");
    scanf("%d",&j1);                       //输入j1控制列数
    printf("please input the element\n");
    for(i=0;i<i1;i++)
        for(j=0;j<j1;j++)
            scanf("%d",&a[i][j]);        //给3*4的范围内赋值
    printf("array a:\n");
    for(i=0;i<i1;i++)
    {
        for(j=0;j<j1;j++)
            printf("\t%d",a[i][j]);     //输出赋值后的3*4的矩阵
        printf("\n");
    }
    for(i=0;i<i1;i++)
        for(j=0;j<j1;j++)
            b[j][i]=a[i][j];        //将数组a的3*4的元素赋给数组b的4*3的区域,完成倒置赋值
    printf("array b:\n");
    for(i=0;i<j1;i++)
    {
        for(j=0;j<i1;j++)
            printf("\t%d",b[i][j]);   //再将倒置赋值后的b数组的4*3的矩阵输出
        printf("\n");
    }
    return 0;
}

下面给出运行截图

在这里插入图片描述

9.在字符串中找元音字母
要求在一个随机输入的字符串中找出所有的元音字母,
下面给出我的代码

#include <stdio.h>
void yuanyin(char a[],char b[]);
void string_input(char a[]);     //函数声明 
int main()
{
 char a[40],b[30];   //定义a字符串用来输入,b用来承接a的元音字母 
 int i = 0,j;
 printf("请输入字符串\n");
 string_input(a);    //调用输入函数
 yuanyin(a,b);      //调用找元音字母函数 
 puts(b);
}
void string_input(char a[])  //自制输入字符串函数 ,它与scanf(“%s")的区别在可以输入空格 
{
 int i;
 for(i=0;i<40;i++)
 {
       scanf("%c",&a[i]);
  
       if(a[i]=='\n')
       {
              a[i] ='\0';break;
       }
 }
} 
void yuanyin(char a[],char b[])
{
 int i,j;
 
    for(j=0,i=0;i<40;i++)
   {
           if((a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u')||(a[i]=='A'||a[i]=='E'||a[i]=='I'||a[i]=='O'||a[i]=='U'))
             {
                     b[j++]=a[i];//把每个元音字母赋给b,每赋一个j+1;j不随着i++ 
             }
           if(a[i]=='\0')break;//当a循环到空字符时就可以跳出 
   }
 b[j]='\0';//在b字符串末尾加上空字符来结束
} 

下面给出程序运行截图
在这里插入图片描述

10.输入字符串求单词个数问题
我们的编译器无法识别单词,但我们可以根据空格的个数来确定单词的个数。

#include <stdio.h>
int main()
{
 char ch;
 
 int word = 0,court=0;     //定义word来判断是否为单词,court用来计数
 
 while((ch=getchar())!='\n')     //直到ch为回车就结束
 {
      if(ch==' ')
      {
            word = 0;     //当出现空格是,word为0(相当于假)
       }
      if(word==0)        //(在开始第一个单词时,court已经加了1)出现空格时,将word设为1,court+1;
      {
             word = 1;
   
              court++;
       }
 }
 
 printf("%d",court);
}

11.打鱼晒网问题
俗话说三天打鱼两天晒网,那么,一年当中那些天是打鱼,那些天是晒网呢
其实和求一个日期是一年的多少天类似,在其基础上,再进行打鱼和晒网条件的判断就可以完成。
下面给出具体的代码

#include <stdio.h>
int runnian(int years);
int dayssum(int years,int months);
int main()
{
    int years,months,days,j;   //定义3个整形变量分别为年月日,j为输入月日在一年中的天数
    printf("请输入年月日\n");
    scanf("%d%d%d",&years,&months,&days);
    j = dayssum(years,months)+days;
    if(j%5>0&&j%5<4)     //若j除以5的余数在1到3之间,那么就可以判断是在打/鱼,否则就是在晒网
    {
          printf("%d  %d  %d 打鱼",years,months,days);
    }
    else
    {
           printf("%d  %d  %d 晒网",years,months,days);
     }
    return 0;  
}
int runnian(int years)   //判断闰年函数,返回一个标记来表示闰年或非闰年
{
    int flag = 0;
    if(years%4==0&&years%100!=0||years%400==0)
    {
           flag = 1;
    }
     return flag;
}
int dayssum(int years,int months)   //日期累加函数,把输入的月份之前月份的月份的天数累加起来
{
     int i;
 
     int sum = 0,a[12]={30,28,31,30,31,30,31,31,30,31,30,31};//用一个数组来存放12个月的天数
 
     if(runnian(years))    //在此函数中再调用闰年判断函数,用以个if来承接标记的返回值
     {
         a[1] = 28;        //如果标记为1(为真),就改变2月分的天数为29天
     }
     for(i=0;i<months-1;i++)   //用一个for循环来累加天数
     {
          sum+=a[i];
      }
 
 return sum;     //最后返回累加值
}

为了方便验算,也可以把j输出。
12,顺序数组插入问题
一个按从小到大的数组,现在要求输入一个数,根据这个数的大小放在对应的位置,
下面给出代码

#include <stdio.h>
void putarray(int a[],int n);    //一位整形数组输出函数声明
int main()
{
     int a[11],i,j,k,t,h;
 
     printf("请顺序输入一个10个数的数组\n");
 
     for(i=0;i<10;i++)    //用一个循环给数组赋值
     {
             scanf("%d",&a[i]);
      }
 
      printf("数组设定为\n");
 
      putarray(a,10);      //调用数组输出函数
 
      printf("请输入一个数");
 
      scanf("%d",&j);      //输入需要插入的数
 
      if(j>=a[9])
      {
             j = a[10];   //如果要插入的数大于最大数,自然排到最后去
      }
      else
      {
                 for(i=0;i<10;i++)    //用一个for循环找到插入值的位置
                 {
                          if(j<a[i])
                          {
                                k = a[i];   //暂存上一个数的值
    
                                 a[i] = j;  //把插入数赋给上一个数
                              for(t=i+1;t<11;t++)//把上一个和上一个的上一个数互换,等于把后面的元素整个往后面移了一位
                              {
                                    h = a[t];     
     
                                   a[t] = k;
     
                                       k = h;
                               }break; //完成循环后用break跳出整个大循环   
                          }
                 } 
 }
 putarray(a,11);//调用函数输出插入后的数组
}
void putarray(int a[],int n)
{
 int i;
    for(i=0;i<n;i++)
 {
  printf("%4d",a[i]);
 }
}

猜你喜欢

转载自blog.csdn.net/jamenu/article/details/84844057