本人能力有限,发出只为帮助有需要的人。

建议同学们自己写完后再进行讨论。

1数字三角阵(15分)

问题描述:按规律根据输入的整数 N,打印 NN 列的数字三角阵。

输入:输入一个正整数 N (≤100)

输出:输出由数字 0~9构成的 NN 列的数字三角矩阵:其中第一列有1个数,第二列有2个数,第 N 列有 N 个数,从上至下、从左至右依次蛇形排列,每个数字占用2个字符空间;整个数字三角阵,除必要的空格、数字、换行符,无多余符号,最后一行最后一个数字后无其他字符。

样例

输入:

11

输出

时间限制:500ms内存限制:32000kb

#includeint main(void){int i,j,n,tem=0,sum=1,a[100];scanf("%d",&n);for(i=0;i<n;i++)//第一行数列的差为等差数列{sum+=tem;sum%=10;//代表只有数字一到九tem++;//公差为一a[i]=sum;}for(i=0;i<n;i++)printf(" %d",a[i]);printf("\n");j=n;while(j-1)//之后每一行的元素都是前一行对应加一{for(i=0;i<n;i++){a[i]=a[i]+1;a[i]%=10;}for(i=0;i<n;i++){if(in-j)printf(" %d",a[i]);}printf("\n");j--;}return 0;}

2英文翻译自然数(15分)

问题描述:按常规英文输出1000以内自然数的英文读法。

输入:每个测试输入包含 1 个测试用例,给出正整数 n(0<=n <1000)

输出:输出占一行:如果 0<=n <1000 用规定的格式输出 n,所有英文单词小写,最后一个单词后无字符;否则输出 ERR

样例1:输入 123 输出:one hundred and twenty-three

样例2:输入 100 输出:one hundred

时间限制:500ms内存限制:32000kb

此题为超星慕课的作业原题

#include#includeint main(void){int n,x1,x2,x3,flag=0,i;char *ToNineteen[20]={"zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventy","eighteen","nineteen"};char *ToNinety[8]={"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};scanf("%d",&n);if(n==0)//0的情况最好单独提出printf("zero");else if(n%100==0){x1=n/100;flag=1;//flag控制空格printf("%s",ToNineteen[x1]);printf(" hundred");}else if(n>100){x1=n/100;n%=100;flag=1;printf("%s",ToNineteen[x1]);printf(" hundred and");//注意and的运用}if(n0)//排除0的情况{if(flag)printf(" ");printf("%s",ToNineteen[n]);}else if(n>19&&n<100){if(n%10==0){x2=n/10;if(flag)printf(" ");printf("%s",ToNinety[x2-2]);//ToNinety的char数组中没有0和10}else{x3=n%10;x2=(n-x3)/10;if(flag)printf(" ");if(x3==0)printf("%s",ToNinety[x2-2]);//ToNinety的char数组中没有0和10else{printf("%s-",ToNinety[x2-2]);//注意十位和个位之间的-printf("%s",ToNineteen[x3]);}}}return 0;}

3特定规则的括号匹配(20分)

问题描述:

`{}`、`[]`、`()`又称大括号、中括号和小括号;括号匹配除了必要的同类型括号左右成对儿且不交叉的规定;还增加如下规则:大括号内能包含大、中、小括号,中括号内只能包含中、小括号,小括号内只能包含小括号。请编写程序判断从键盘输入的以`#`结束的字符串(可能包含空格、回车、换行和制表等符号,字符串长度不限),其中的`{}`、`[]`、`()`是否按照上述规则匹配。如果匹配成功,则输出提示信息`MATCHED`和匹配的括号对的数目;如果匹配不成功,则输出提示信息`ERR`,以及在出现第一个错误前、已经匹配的括号对的数目(提示信息和括号对数目的中间,以一个西文空格间隔)。匹配括号对的数目不超过int型可表示范围,且括号嵌套层数不超过100层。

输入:以`#`结束的任意长度字符串;其中匹配括号对的数目不超过int型可表示范围,且括号嵌套层数不超过100层。

输出:如果按上述规则大、中、小括号匹配成功,则输出提示信息`MATCHED`和匹配的括号对的数目;如果匹配不成功,则输出提示信息`ERR`,以及在出现第一个错误前,已经匹配的括号对的数目(提示信息和括号对数目的中间,以一个西文空格间隔),除此之外无其它字符。

样例1:

输入programming#

输出 MATCHED 0

样例2:

输入o{n[lin(e j)udgem]e}{[[()]]}nt#

输出MATCHED 7

样例3:

输入{}[[[()]({})]]#

输出ERR 3

样例3的括号匹配错误出现在最后一个`(`,此前已经匹配成功的括号有3对:{}[()]。

时间限制:500ms内存限制:32000kb

此题是超星慕课的作业,稍微修改了一下规则。

#include#include#define SIZE 100char stack[SIZE],ch,out;int top,flag=0,num=0,tem=0,i;int push(char x);char pop(void);void check(char x,char y);int main(void){top=0;push('#');//栈的第一个元素ch=getchar();while(ch!='#'){switch(ch)//筛选所有括号入栈{case'(':case'[':case'{':push(ch);break;//switch的break用法case')':out=pop();check(out,'(');break;case']':out=pop();check(out,'[');break;case'}':out=pop();check(out,'{');break;}ch=getchar();//检测下一个char}if(flag==0)//检测flag是否被改变printf("MATCHED %d",num);elseprintf("ERR %d",num);return 0;}int push(char x)//压入{for(i=0;i<top;i++)//找栈里面有没有更小的括号{if(stack[i]SIZE-1)//栈的输入大于等于SIZEreturn 0;else{stack[top]=x;top+=1;return 1;}}char pop(void)//弹出{if(top<1)//栈为空的情况return 0;else{top-=1;out=stack[top];return out;}}void check(char x,char y)//检测左右括号{if(x=='#'||x=='\0')//检测栈是否弹出结束flag=1;else if(y!=x)//检测括号没有交叉flag=1;elseif(!flag)//flag表示有错num++;}

4生成有序序列(20分)

问题描述:设整数集合 M 定义如下:1∈M;若x∈M , 则2x+1∈M , 3x+1∈M;没有别的整数属于集合 M。编程序按递增顺序生成并输出集合M的无重复的前n(n<50)项。
输入:一个整数n
输出:n个无重复的递增整数,整数之间以一个西文空格间隔,最后一个整数后无多余字符。
样例:输入3 输出1 3 4

时间限制:500ms内存限制:32000kb

此题为超星慕课上的作业原题

#includeint main(void)//此方法使用除法{int a[1000],n,i,j,k,l,m,x,y,flag=0;//数组要开大一些,分配多些内存scanf("%d",&n);a[0]=1;printf("1");k=1;for(i=3;i<7*n;i++){j=i;x=0;y=0;if((i-1)%2==0)//分别考虑*2+1和*3+1的情况x=(i-1)/2;if((i-1)%3==0)y=(i-1)/3;for(m=0;m<k;m++)if(x==a[m]||y==a[m]){a[k]=i;k++;//k为新数组的位数break;}}for(i=1;i<n;i++)printf(" %d",a[i]);//控制空格return 0;}

5十六进制大整数加法(20分)

问题描述:编写程序,从键盘读入形如X + Y=的表达式计算结果,其中X和Y都是合法且长度不超过64位的十六进制非负整数,结果中所有字符均大写且无多余的零。

样例1:输入 1234+1234=输出0X2468

样例2:输入 0000+12A= 输出0X12A

样例3:输入 12ff+1= 输出 0X1300

时间限制:500ms内存限制:32000kb

通常的思路是将十六进制数转化成十进制数,相加后再将十进制数转换成十六进制。但此题在题目里写明了计算的整数很大,所以转换成十进制整数后会超过long long的范围。以下为此思路代码(一个测试点有误)

#include #include #include long long hex(char *m);void printHex(long long n)//输出十六进制数的递归写法{if(n){printHex(n/16);if(n%16>=10)printf("%c",n%16-10+'A');elseprintf("%d",n%16);}}int main(void){char a[200]={0},b[100]={0},c[100]={0};char *p,*q;long long n0,n1,n2,i,intb,intc,result;scanf("%s",a);//输入一个字符串p=a;while(*p!='+')//使指针p指向+p++;n1=p-a;//获得第一个十六进制数的长度q=p+1;//指针q为第二个十六进制数的初指针while(*q!='=')q++;n2=q-p-1;//获得第二个十六进制数的长度for(i=0;i<n1;i++)b[i]=a[i];//存储第一个数组for(i=0;i<n2;i++)c[i]=p[i+1];//存储第二个数组intb=hex(b);intc=hex(c);result=intb+intc;printf("0X");printHex(result);return 0;}long long hex(char *m)//将十六进制数化成十进制{long long tem=strlen(m),sum=0;for(int i=0;i='A'&&*(m+i)='a'&&*(m+i)<='f')sum+=(*(m+i)-'a'+10)*pow(16,tem-i-1);elsesum+=(*(m+i)-'0')*pow(16,tem-i-1);}return sum;}

事实上,c语言可以直接输入输出十六进制数(其本质与上面代码相同),但也无法满足此题要求。代码如下。

#include #include int main(){long long a,b;//本质也是将十六进制转换成十进制,导致大整数溢出scanf("%llx %llx",&a,&b);//此处大小写都可以十六进制输入printf("0X%llX",a+b);//%llX为大写双精度十六进制格式return 0;}

转化思路,将十六进制数看成字符串,将每一位字符转化成十进制存入整型数组,再将两整型数组按位相加,便可以计算大整数。代码如下。

#include #include #include int max(int x,int y)//取两个整数中大的那个{int result=x;if(x<y)result=y;return result;}int main(void){char a[200]={0},res[100]={0};char *p,*q;int n0,n1,n2,n3,i,b[100]={0},c[100]={0},intres[100]={0},flag=0,tem;scanf("%s",a);p=a;while(*p!='+')p++;n1=p-a;q=p+1;while(*q!='=')q++;n2=q-p-1;//同样的获取两个十六进制字符串for(i=0;i='A'&&*(a+i)='a'&&*(a+i)<='f')b[i]=(*(a+i)-'a'+10);elseb[i]=(*(a+i)-'0');}for(i=0;i='A'&&*(p+1+i)='a'&&*(p+1+i)0;i--)//得到十六进制数组相加的按位表示{if(n1>0&&n2>0)intres[i-1]=b[n1-1]+c[n2-1];//之前此处有数组越界,感谢Rake449的提醒else if(n1>0&&n2<=0)intres[i-1]=b[n1-1];else if(n10)intres[i-1]=c[n2-1];n1--;n2--;}for(i=n3;i>0;i--){tem=(intres[i-1]+flag);//flag为进位if(tem>=16){tem=tem%16;if(tem>=10)res[i-1]=tem-10+'A';elseres[i-1]=tem+'0';flag=1;}else{if(tem>=10)res[i-1]=tem-10+'A';elseres[i-1]=tem+'0';flag=0;}}if(flag)//最高位有进位的情况printf("0X1%s",res);elseprintf("0X%s",res);return 0;}