以下全是些经典的例题
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个数开始,每个个时前两个数的和
下面给出代码
#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]);
}
}