【C语言】字符串刷题篇在这里哦!
【C语言】字符串—刷题篇
【C】语言经典题目,五个摘录为一篇,将会持续更新啦!
题目
已知有1、2、3、4这几个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
✨分析
已知: 1,2,3,4这几个数字;
组成三位数;
互不相同;
各位十位百位数字无重复;
输出: 有多少个;
是多少;
思路: 用循环嵌套进行遍历,表示三个数即百位数字 * 100+十位数字 * 10+各位数字。
但是要控制个位十位百位数字各不相同,所以用if 语句判断,如果各位不等于十位且不等于百位,十位不等于百位,就进行输出。
而输出要求先输出多少个,最后才依次输出三位数。所以每一次循环可以把这个三位数放到数组中,保存下来。最后输出。
对于有多少个,符合if语句的用计数器计1。
#include
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
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
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
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
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
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
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
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;
}
感谢小伙伴的阅读,有错误的地方欢迎指出交流呀