You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

567 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <stdio.h>
#include<math.h>
#include<string.h>
#define PI 3.1415926535
#define N 1000
#define M 0.00000001
#define ull unsigned long long
int choose(void);//菜单选项输入函数
void output_hand(void);//菜单内容输入函数
void add(void);//加法函数
void sub(void);//减法函数
void mul(void);//乘法函数
void div(void);//除法函数
void remainde(void);//求模运算函数
void factorial(void);//阶乘函数
void prime(void);//判断素数函数
void volume(void);//求球的体积
void fibonacci(void);//斐波那契数列函数
void power(void);//求次方
void minmul(void);//最小公倍数
void maxdiv(void);//最大公约数
void Swap(void);//交换函数
void Sort(void);//排序函数
double input_decimal(int *flag);//输入双精度小数的函数
long long input_integer(int *flag);//输入整数的函数
int choose(void)
{
int flag=1,ch;//flag标记输入格式是否正确
printf("请输入需要进行操作的编号\n");
ch=input_integer(&flag);
if(flag)
return ch;
else
{
printf("输入有误\n");
return choose();
}
}
void output_hand(void)
{
printf("1----两个数的加法\n");
printf("2----两个数的减法\n");
printf("3----两个数的乘法\n");
printf("4----两个数的除法\n");
printf("5----两个数的求模运算\n");
printf("6----求一个数的阶乘\n");
printf("7----判断一个数是否为素数\n");
printf("8----已知半径求其球的体积\n");
printf("9----求斐波那切数列的某项\n");
printf("10----求一个数的n次方\n");
printf("11----求两个数的最大公约数\n");
printf("12----求两个数的最小公倍数\n");
printf("13----交换两个数\n");
printf("14----对输入的若干个数进行排序\n");
printf("0----结束程序\n");
}
void add(void)
{
int flag1=1,flag2=1,t,flag=1;//flag1,flag2和flag标记输入格式是否正确
printf("请选择输入格式1为整数0为小数结果保留两位有效小数\n");
while(1)
{
t=input_integer(&flag);
if((t==1||t==0)&&flag)
break;
else
printf("输入有误\n请重新输入\n");
}
printf("请输入两个加数\n");
if(!t)
{
double a,b;
do
{
if((flag1+flag2)<2)
printf("输入有误\n请重新输入\n");
a=input_decimal(&flag1);
b=input_decimal(&flag2);
}while(flag1==0||flag2==0);
printf("%.2lf\n",a+b);
}
else
{
long long a,b;
do
{
if((flag1+flag2)<2)
printf("输入有误\n请重新输入\n");
a=input_integer(&flag1);
b=input_integer(&flag2);
}while(flag1==0||flag2==0);
printf("%lld\n",a+b);
}
}
void sub(void)
{
int flag1=1,flag2=1,t,flag=1;//flag1,flag2和flag标记输入格式是否正确
printf("请选择输入格式:1为整数;0为小数(结果保留两位有效小数)\n");
while(1)
{
t=input_integer(&flag);
if((t==1||t==0)&&flag)
break;
else
printf("输入有误\n请重新输入\n");
}
printf("请依次输入被减数和减数\n");
if(!t)
{
double a,b;
do
{
if((flag1+flag2)<2)
printf("输入有误\n请重新输入\n");
a=input_decimal(&flag1);
b=input_decimal(&flag2);
}while(flag1==0||flag2==0);
printf("%.2lf\n",a-b);
}
else
{
long long a,b;
do
{
if((flag1+flag2)<2)
printf("输入有误\n请重新输入\n");
a=input_integer(&flag1);
b=input_integer(&flag2);
}while(flag1==0||flag2==0);
printf("%lld\n",a-b);
}
}
void mul(void)
{
int flag1=1,flag2=1,t,flag=1;//flag1,flag2和flag标记输入格式是否正确
printf("请选择输入格式:1为整数;0为小数(结果保留两位有效小数)\n");
while(1)
{
t=input_integer(&flag);
if((t==1||t==0)&&flag)
break;
else
printf("输入有误\n请重新输入\n");
}
printf("请输入两个乘数\n");
if(!t)
{
double a,b;
do
{
if((flag1+flag2)<2)
printf("输入有误\n请重新输入\n");
a=input_decimal(&flag1);
b=input_decimal(&flag2);
}while(flag1==0||flag2==0);
printf("%.2lf\n",a*b);
}
else
{
long long a,b;
do
{
if((flag1+flag2)<2)
printf("输入有误\n请重新输入\n");
a=input_integer(&flag1);
b=input_integer(&flag2);
}while(flag1==0||flag2==0);
printf("%lld\n",a*b);
}
}
void div(void)
{
int flag1=1,flag2=1,t,flag=1;//flag1,flag2和flag标记输入格式是否正确
printf("请选择输入格式:1为整数;0为小数(结果保留两位有效小数)\n");
while(1)
{
t=input_integer(&flag);
if((t==1||t==0)&&flag)
break;
else
printf("输入有误\n请重新输入\n");
}
printf("请依次输入被除数和除数\n");
if(!t)
{
double a,b=1;
do
{
if((flag1+flag2)<2||fabs(b)<M)//除数不能为0
printf("输入有误\n请重新输入\n");
a=input_decimal(&flag1);
b=input_decimal(&flag2);
}while(flag1==0||flag2==0||fabs(b)<M);
printf("%.2lf\n",a/b);
}
else
{
long long a,b=1;
do
{
if((flag1+flag2)<2||b==0)//除数不能为0
printf("输入有误\n请重新输入\n");
a=input_integer(&flag1);
b=input_integer(&flag2);
}while(flag1==0||flag2==0||b==0);
printf("%lld\n",a/b);
}
}
void remainde(void)
{
long long a,b;
int flag1=1,flag2=1;//flag1,flag2标记输入格式是否正确
printf("请输入两个正整数\n");
do
{
if((flag1+flag2)<2||a<1||b<1)
printf("输入有误\n请重新输入\n");
a=input_integer(&flag1);
b=input_integer(&flag2);
}while(flag1==0||flag2==0||a<1||b<1);
printf("%lld\n",a%b);
}
void factorial(void)
{
long long a;
ull s=1;
int flag=1,i;
printf("请输入一个自然数\n");//flag标记输入格式是否正确
do
{
if(flag==0||a<0)
printf("输入有误\n请重新输入\n");
a=input_integer(&flag);
}while(flag==0||a<0);
if(a==0)
printf("1\n");
else
{
for(i=1;i<=a;i++)
s*=i;
printf("%llu\n",s);
}
}
void prime(void)
{
long long a;
double t;
int flag=1,i;
printf("请输入一个正整数\n");//flag标记输入格式是否正确
do
{
if(flag==0||a<1)
printf("输入有误\n请重新输入\n");
a=input_integer(&flag);
}while(flag==0||a<1);
if(a==1)
printf("NO\n");
else if(a==2)
printf("YES\n");
else
{
t=sqrt(a);
for(i=2;i<=t;i++)
if(a%i==0)
{
printf("NO\n");
break;
}
if(i>t)
printf("YES\n");
}
}
void volume(void)
{
double a;
int flag=1;//flag标记输入格式是否正确
printf("请输入一个正数(结果保留两位小数,圆周率取3.1415926535\n");
do
{
if(flag==0||a<0)
printf("输入有误\n请重新输入\n");
a=input_decimal(&flag);
}while(flag==0||a<0);
printf("%.2lf\n",4*PI*a*a*a/3);
}
void fibonacci(void)
{
long long a,f1=1,f2=1,t;//第一项和第二项为1
int flag=1,i;//flag标记输入格式是否正确
printf("请输入一个正整数\n");
do
{
if(flag==0||a<1)
printf("输入有误\n请重新输入\n");
a=input_integer(&flag);
}while(flag==0||a<1);
if(a==1||a==2)
printf("1\n");
else
{
for(i=3;i<=a;i++)
{
t=f1+f2;
f1=f2;
f2=t;
}
printf("%lld\n",f2);
}
}
void power(void)
{
double a,s=1;
int b,i;
int flag1=1,flag2=1;//flag1,flag2标记输入格式是否正确
printf("请依次输入底数和指数(指数须为自然数,结果保留两位小数)\n");
do
{
if(flag2==0||flag1==0||b<0)
printf("输入有误\n请重新输入\n");
a=input_decimal(&flag2);
b=input_integer(&flag1);
}while(flag2==0||flag1==0||b<0);
for(i=0;i<b;i++)
s*=a;
printf("%.2lf\n",s);
}
void minmul(void)
{
long long a,b,t=1,i,min,max;//t为最大公约数min存放ab中的最小值
int flag1=1,flag2=1;//flag1,flag2和标记输入格式是否正确
printf("请输入两个正整数\n");
do
{
if((flag1+flag2)<2||a<=0||b<=0)
printf("输入有误\n请重新输入\n");
a=input_integer(&flag1);
b=input_integer(&flag2);
}while(flag1==0||flag2==0||a<=0||b<=0);
min=a<b?a:b;
max=a>b?a:b;
while(max%min)
{
t=max%min;
max=min;
min=t;
}
printf("%lld\n",a*b/min);
}
void maxdiv(void)
{
long long a,b,t=1,i,min,max;//t为最大公约数min存放ab中的最小值
int flag1=1,flag2=1;//flag1,flag2和标记输入格式是否正确
printf("请输入两个正整数\n");
do
{
if((flag1+flag2)<2||a<=0||b<=0)
printf("输入有误\n请重新输入\n");
a=input_integer(&flag1);
b=input_integer(&flag2);
}while(flag1==0||flag2==0||a<=0||b<=0);
min=a<b?a:b;
max=a>b?a:b;
while(max%min)
{
t=max%min;
max=min;
min=t;
}
printf("%lld\n",min);
}
void Swap(void)
{
long long a,b;
int flag1=1,flag2=1;//flag1,flag2标记输入格式是否正确
printf("请输入两个整数\n");
do
{
if((flag1+flag2)<2)
printf("输入有误\n请重新输入\n");
a=input_integer(&flag1);
b=input_integer(&flag2);
}while(flag1==0||flag2==0);
printf("%lld %lld\n",b,a);
}
void Sort(void)
{
long long a[N];
int flag1=1,flag2=1,n=1,t=1,flag=1,i,s;//flag1,flag2和flag标记输入格式是否正确s是输入合格数据的个数t判定排序方式
printf("请输入需要排序的数的个数(不超过1000的正整数)和需要排序的方式(0代表升序,1代表降序)\n");
do
{
if((flag1+flag2)<2||(t!=0&&t!=1)||n>N||n<=0)
printf("输入有误\n请重新输入\n");
n=input_integer(&flag1);
t=input_integer(&flag2);
}while(flag1==0||flag2==0||(t!=0&&t!=1)||n>N||n<=0);
do
{
s=0;
for(i=0;i<n;i++)
{
a[i]=input_integer(&flag);
if(flag)
s++;
flag=1;
}
if(s!=n)
printf("输入有误\n请重新输入\n");
}while(s!=n);
while(s--&&flag)
{
flag=0;
for(i=0;i<s;i++)
{
if(a[i]>a[i+1])
{
flag=1;
int temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
if(t==0)
for(i=0;i<n;i++)
{
if(i==n-1)
printf("%lld\n",a[i]);
else
printf("%lld ",a[i]);
}
else
for(i=n-1;i>=0;i--)
{
if(i)
printf("%lld ",a[i]);
else
printf("%lld\n",a[i]);
}
}
double input_decimal(int *flag)
{
char a[N];
*flag=1;//先默认输入格式合格为1不合格为0
int i=0,symbol=1,point=0;//symbol判定正负号point判定小数点是否出现过
double s=0,t=0.1;//t为小数点后部分转化s存放总值
scanf("%s",a);
if((a[0]=='-'&&strlen(a)==1)||(a[0]=='0'&&a[1]=='0'))//防止输入"00" "-"判定输入合格
{
*flag=0;
return 0;
}
else if(a[0]=='-')//检测并处理正负号
{
symbol=-1;
i=1;
}
while(a[i]!='\0')
{
if((a[i]>='0'&&a[i]<='9')&&point==0)//处理整数部分数字字符
s=s*10+(a[i]-'0');
else if((a[i]>='0'&&a[i]<='9')&&point)//处理小数部分数字字符
{
s+=(a[i]-'0')*t;
t*=0.1;
}
else if(a[i]=='.'&&point==0)//处理第一次出现的小数点
point=1;
else//处理非法字符
{
*flag=0;//标记输入了无效字符
return 0;
}
i++;
}
return s*symbol;
}
long long input_integer(int *flag)
{
char a[N];
*flag=1;//先默认输入格式合格为1不合格为0
long long i=0,s=0,symbol=1;//symbol判定正负号
scanf("%s",a);
if((a[0]=='-'&&strlen(a)==1)||(a[0]=='0'&&strlen(a)>1))//防止输入前导零和'-'判定输入合格
{
*flag=0;
return 0;
}
else if(a[0]=='-')//检测并处理正负号
{
symbol=-1;
i=1;
}
while(a[i]!='\0')
{
if(a[i]>='0'&&a[i]<='9')//处理数字字符
s=s*10+(a[i]-'0');
else//处理非法字符
{
*flag=0;//标记输入了无效字符
return 0;
}
i++;
}
return s*symbol;
}
int main()
{
int temp,flag=1,i=1,t=1;
double a;
output_hand();
while(1)
{
temp=choose();
switch(temp)
{
case 0://0表示结束程序
return 0;
case 1:
add();
break;
case 2:
sub();
break;
case 3:
mul();
break;
case 4:
div();
break;
case 5:
remainde();
break;
case 6:
factorial();
break;
case 7:
prime();
break;
case 8:
volume();
break;
case 9:
fibonacci();
break;
case 10:
power();
break;
case 11:
maxdiv();
break;
case 12:
minmul();
break;
case 13:
Swap();
break;
case 14:
Sort();
break;
default:
printf("输入有误\n");
break;
}
}
}