三位数
💫题目
已知有1、2、3、4这几个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
✨分析
已知: 1,2,3,4这几个数字;
组成三位数;
互不相同;
各位十位百位数字无重复;
输出: 有多少个;
是多少;
思路: 用循环嵌套进行遍历,表示三个数即百位数字 * 100+十位数字 * 10+各位数字。
但是要控制个位十位百位数字各不相同,所以用if 语句判断,如果各位不等于十位且不等于百位,十位不等于百位,就进行输出。
而输出要求先输出多少个,最后才依次输出三位数。所以每一次循环可以把这个三位数放到数组中,保存下来。最后输出。
对于有多少个,符合if语句的用计数器计1。
#include<stdio.h> int main (void) { int array[100]={0};//数组初始化为0 int count=0,i=0; int a,b,c; 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) { array[i]=a*100+b*10+c; i++; count++; } printf("这样的三位数有%d个\n",count); for (i=0;i<count;i++) printf("%d ",array[i]); printf("\n"); return 0; }
水仙花数
💫题目
打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
✨分析
利用循环对100~999进行遍历,判断是不是完数,是则输出。
#include <stdio.h> int main (void) { int i,a,b,c; for (i=100;i<1000;i++) { c=i%10;//个位 b=i/10%10;//十位 a=i/100;//百位 if (a*a*a+b*b*b+c*c*c==i) { printf("%d ",i); } } return 0; }
完数
💫题目
一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3编程找出1000以内的所有完数。
✨分析
利用循环遍历1~1000;
将它所有的因子求和;
判断因子之后是否等于它本身,是则输出。
#include <stdio.h> int main (void) { int i,k,sum; for (i=2;i<=1000;i++) { sum=0;//注意sum的初始化必须在循环内 for (k=1;k<i;k++) if (i%k==0) sum+=k; if (sum==i) printf("%d ",i); } return 0; printf("\n"); }
输出结果:
6 28 496
求利润
💫题目
企业发放的奖金根据利润提成:
利润(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%提成
已知: 利润(从键盘输入)
输出: 根据利润的范围,计算提成并输出。
思路: 可以用多分支选择语句,即多个if
#include<stdio.h> double f1(int n); double f2(int n); double f3(int n); double f4(int n); double f5(int n); double f6(int n); int main (void) { int n; double m; printf("请输入利润:\n"); scanf("%d",&n); if (n>0 && n <=1e5)//用科学计数法表示比较简洁 m=f1(n); else if(n>1e5 && n<=2e5) m=f2(n); else if (n>2e5 && n<=4e5) m=f3(n); else if (n>4e5 && n<=6e5) m=f4(n); else if (n>6e5 && n<=1e6) m=f5(n); else if (n>1e6) m=f6(n); printf("%lf",m); return 0; } double f1(int n) { return n*0.1; } double f2(int n) //低于10万的部分用f1()函数 { return f1(1e5)+(n-1e5)*0.075; } double f3(int n) //低于20万的部分用f2()表示 { return f2(2e5)+(n-2e5)*0.05; }double f4(int n) { return f3(4e5)+(n-4e5)*0.03; } double f5(int n) { return f4(6e5)+(n-6e5)*0.015; }double f6(int n) { return f5(1e6)+(n-1e6)*0.01; }
三个数数字排序
💫题目
输入三个数,x、y、z,请把它们从小到大输出。
✨分析
方法一: 可以使用假定法排序,思路就是:假设x是最小的,x和进行比较,若y大于x,则交换x和y的值,使得x是x、y中最小的……
方法二: 方法二可以使用指针 ,对三个数完成排序。
方法三: 使用三目运算符,求得三个数中最大的和最小的,然后用它们的和减去最大值最小值得到中间值。
代码实现
方法一:
#include <stdio.h> int main (void) { int x,y,z,tmp; scanf("%d%d%d",&x,&y,&z); if (y<x) { tmp=x; x=y; y=tmp; } if(z<x) { tmp=x; x=z; z=tmp; } if (z<y) { tmp=y; y=z; z=tmp; } printf("%d %d %d\n",x,y,z); return 0; }
方法二:
#include <stdio.h> void fun(int*a,int*b,int*c); int main (void) { int x,y,z; int *a=&x,*b=&y,*c=&z; //给指针a、b、c赋值(地址值) scanf("%d%d%d",&x,&y,&z); fun (a,b,c); printf("%d %d %d\n",*a,*b,*c); return 0; } void fun(int*a,int*b,int*c) { int tmp; if (*b<*a) { tmp=*a; *a=*b; *b=tmp; } if (*c<*a) { tmp=*a; *a=*c; *c=tmp; } if (*c<*b) { tmp=*b; *b=*c; *c=tmp; } }
▶️▶️在这里给大家补充一下,错误的程序!
#include <stdio.h> void fun(int*a,int*b,int*c); int main (void) { int x,y,z; int *a=&x,*b=&y,*c=&z; //给指针a、b、c赋值(地址值) scanf("%d%d%d",&x,&y,&z); fun (a,b,c); printf("%d %d %d\n",*a,*b,*c); return 0; } void fun(int*a,int*b,int*c) { int *tmp; if (*b<*a) { tmp=a; a=b; b=tmp; } if (*c<*a) { tmp=a; a=c; c=tmp; } if (*c<*b) { tmp=b; b=c; c=tmp; } }
在这个程序中,并不会实现将x、y、z三个数中按照从小到大的顺序进行输出。
这是因为,当主函数把程序的执行控制权交给被调函数fun()时,将实参*a,*b,*c传给实参变量。若 *a>*b,则交换a和b的值,使得a指向y,b指向x。但此时并不会改变x和y的值,当函数调用结束后,释放a与b的内存空间,将程序执行的控制权交给主调函数,所以,并不能改变主函数中变量x、y、z的值。
方法三:
#include <stdio.h> int main (void) { int x,y,z; int min,mid,max,sum; scanf("%d%d%d",&x,&y,&z); sum=x+y+z; max=(x>y?x:y)>z?(x>y?x:y):z; min=(x<y?x:y)<z?(x<y?x:y):z; mid=sum-min-max; printf("%d %d %d\n",min,mid,max); return 0; }
感谢小伙伴的阅读🥰,有错误的地方欢迎指出交流呀🌹