版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21149391/article/details/79430462
#include<stdio.h>
#define N 20
int main(){
int octal(int decimal);
int decimal,oct;
printf("Please input the Decimal number:");
scanf("%d",&decimal);
printf("The Octal number is:");
oct = octal(decimal);
printf("%d\n",oct);
return 0;
}
int octal(int decimal){
int *octal = (int *)malloc(N * sizeof(int));
int Oct=0;
int i,j;
while(decimal>0){
octal[i] = decimal % 8;
decimal = (decimal - octal[i]) / 8;
i++;
}
for(j=0;j<i;j++)
Oct += octal[j]* pow(10,j);
return Oct;
}
运行结果:
思路:
第一步,输入并存于两个数组中(一个int型,一个double型故用两个数组,也可以double fraction[N][3],在第三位保存分数的值)
第二步,以分数的值排序
第三部,化简分子分母,分子分母同时除以最大公约数
#include<stdio.h>
#define N 5 //输入5个分数,按题要求应换为100
int main(){
int max_CommonDivisor(int x,int y);
int **sort(int **fraction,double result[]);
int i,j,sign,max_commonDivisor;
int fraction[N][2];//第一位存分子,第二位存分母
double result[N];//result为fraction的小数,下标相对应
for(i=0;i<N;i++){
printf("请输入第%d个分数的分子:",i+1);
scanf("%d",&fraction[i][0]);
printf("请输入第%d个分数的分母:",i+1);
scanf("%d",&fraction[i][1]);
result[i] = (double)fraction[i][0]/(double)fraction[i][1];
printf("请输入第%d个分数为:",i+1);
printf("(%d,%d)\n",fraction[i][0],fraction[i][1]);
}
int **frac = sort((int **)fraction,result);
printf("化简+排序之后:--------------------------\n");//输出
for(i=0;i<N;i++){
//max_commonDivisor = max_CommonDivisor(frac[i][0],frac[i][1]);
max_commonDivisor = max_CommonDivisor( *((int *)frac+2*i), *((int *)frac+2*i+1));
*((int *)frac+2*i)=*((int *)frac+2*i) / max_commonDivisor;
*((int *)frac+2*i+1)=*((int *)frac+2*i+1) / max_commonDivisor;
printf("(%d,%d)\t",*((int *)frac+2*i),*((int *)frac+2*i+1));
}
}
int **sort(int **fraction,double result[N]){
int i,j,sign;
//排序,每次遍历找出最大的一个数,将其放入数组末尾
int x,y;
double max=0;
for(i=N-1;i>0;i--){
max=result[0];
sign = 0;
for(j=0;j<=i;j++)
if(result[j]>max){
sign = j;
max=result[j];
}
// //交换数组result的下标为sign与i的数
result[sign]= result[i];
result[i] = max;
//交换数组fraction的下标为sign与i的数
x = *((int *)fraction+2*sign);
y = *((int *)fraction+2*sign+1);
*((int *)fraction+2*sign) = *((int *)fraction+2*i);
*((int *)fraction+2*sign+1) = *((int *)fraction+2*i+1);
*((int *)fraction+2*i) = x;
*((int *)fraction+2*i+1) = y;
// x=fraction[sign][0];y=fraction[sign][1];
// fraction[sign][0] = fraction[i][0];
// fraction[sign][1] = fraction[i][1];
// fraction[i][0] = x;
// fraction[i][1] = y;
}
return fraction;
}
/*求x,y的最大公约数*/
int max_CommonDivisor(int x,int y){
int max,min,t;
if(x>y){
max = x;
min = y;
}else{
max = y;
min = x;
}
while(max % min != 0){
t = min;
min = max % min;
max = t;
}
return min;
}
运行结果:
思路:
①首位必为a
②a之后只能是a||b||c||d
③b之后只能是b||c||d
④c之后只能是c||d
⑤d之后只能是d||空
以上有任意一项不满足,则返回NO,若全满足,则返回YES
#include<stdio.h>
#include<stdbool.h>
#define N 100
int main(){
bool jude(char str[N]);
char str[N];
scanf("%s",str);
if(jude(str))
printf("Y\n");
else
printf("N\n");
return 0;
}
bool jude(char str[N]){
int i;
char s;
if(str[0]!='a')
return false;
for(i=0;(s=str[i])!='\0';i++){
if(s=='a'||s=='b'||s=='c'||s=='d'){
if(s=='a'){//a之后只能为a,b,c,d
if(str[i+1]!='a'&&str[i+1]!='b'&&str[i+1]!='c'&&str[i+1]!='d')
return false;
}
else if(s=='b'){//b之后只能为b,c,d
if(str[i+1]!='b'&&str[i+1]!='c'&&str[i+1]!='d')
return false;
}
else if(s=='c'){//c之后只能为c,d
if(str[i+1]!='c'&&str[i+1]!='d')
return false;
}
else if(s=='d'){//d之后只能为d或空
if(str[i+1]!='d'&&str[i+1]!='\0')
return false;
}
}else
return false;
}//若全部满足,则属于题中集合
return true;
}
思路:
注:题中给的文法,元素只有a,符号只有+和*
a+a 的前缀表达式:+(a,a) 、后缀表达式(a,a)+
可见,a位置不变,只有运算符的位置改变,由前缀变为后缀,运算符由括号前变为括号后
如题中给的例子:+ ( * ( a ,+ ( a , a ) ) , a )变为( ( a , ( a , a ) + ) * , a ) +
每个运算符的位置变为,离它最近的括号之后
其他字母,括号位置不变
#include<stdio.h>
#define N 100
int main(){
char *Postfix(char *str);
char str[N];
printf("请输入正确的前缀表达式:");
scanf("%s",str);
char *string = Postfix(str);
printf("后缀表达式为:");
puts(string);
}
char *Postfix(char *str){
int i,j,k,sign,n;
char s,c;
for(i=0;(s=str[i])!='\0';i++)//计算str中有多少个运算符
if(s=='+'||s=='*') n++;
for(i=0;(s=str[i])!='\0'&&n>0;i++){//只需执行n次调整运算符,若超出n次,会将已经调整好的换错位置
sign=0;//用于记录括号,每次置零
if(s=='+'||s=='*'){
n--;
for(j=i+1;(c=str[j])!='\0';j++){
if(c=='(') sign++;
else if(c==')') sign--;
//找到离s最近的括号的右括号,将s放在右括号右侧,括号内全部向左移一位
if(sign==0){
//依次向前移一位
for(k=i;k<j+1;k++){
str[k] = str[k+1];
}
str[j] = s;
break;
}
}
}
}
return str;
}
运行结果:(输入例子中的输入)