本人能力有限,发出只为帮助有需要的人。
建议同学们自己写完后再进行讨论。
问题描述:按规律根据输入的整数 N,打印 N 行 N 列的数字三角阵。
输入:输入一个正整数 N (≤100)
输出:输出由数字 0~9构成的 N 行 N 列的数字三角矩阵:其中第一列有1个数,第二列有2个数,第 N 列有 N 个数,从上至下、从左至右依次蛇形排列,每个数字占用2个字符空间;整个数字三角阵,除必要的空格、数字、换行符,无多余符号,最后一行最后一个数字后无其他字符。
样例:
输入:
11
输出
时间限制:500ms内存限制:32000kb
#include
int main(void)
{
int i,j,n,tem=0,sum=1,a[100];
scanf("%d",&n);
for(i=0;in-j)
printf(" %d",a[i]);
}
printf("\n");
j--;
}
return 0;
}
问题描述:按常规英文输出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
#include
int 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(n<=19&&n>0)//排除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和10
else
{
printf("%s-",ToNinety[x2-2]);//注意十位和个位之间的-
printf("%s",ToNineteen[x3]);
}
}
}
return 0;
}
问题描述:
`{}`、`[]`、`()`又称大括号、中括号和小括号;括号匹配除了必要的同类型括号左右成对儿且不交叉的规定;还增加如下规则:大括号内能包含大、中、小括号,中括号内只能包含中、小括号,小括号内只能包含小括号。请编写程序判断从键盘输入的以`#`结束的字符串(可能包含空格、回车、换行和制表等符号,字符串长度不限),其中的`{}`、`[]`、`()`是否按照上述规则匹配。如果匹配成功,则输出提示信息`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 100
char 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);
else
printf("ERR %d",num);
return 0;
}
int push(char x)//压入
{
for(i=0;iSIZE-1)//栈的输入大于等于SIZE
return 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;
else
if(!flag)//flag表示有错
num++;
}
问题描述:设整数集合 M 定义如下:1∈M;若x∈M , 则2x+1∈M , 3x+1∈M;没有别的整数属于集合 M。编程序按递增顺序生成并输出集合M的无重复的前n(n<50)项。
输入:一个整数n
输出:n个无重复的递增整数,整数之间以一个西文空格间隔,最后一个整数后无多余字符。
样例:输入3 输出1 3 4
时间限制:500ms内存限制:32000kb
此题为超星慕课上的作业原题
#include
int 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
问题描述:编写程序,从键盘读入形如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');
else
printf("%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='A'&&*(m+i)<='F')
sum+=(*(m+i)-'A'+10)*pow(16,tem-i-1);
else if(*(m+i)>='a'&&*(m+i)<='f')
sum+=(*(m+i)-'a'+10)*pow(16,tem-i-1);
else
sum+=(*(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='A'&&*(a+i)<='F')
b[i]=(*(a+i)-'A'+10);
else if(*(a+i)>='a'&&*(a+i)<='f')
b[i]=(*(a+i)-'a'+10);
else
b[i]=(*(a+i)-'0');
}
for(i=0;i='A'&&*(p+1+i)<='F')
c[i]=(*(p+1+i)-'A'+10);
else if(*(p+1+i)>='a'&&*(p+1+i)<='f')
c[i]=(*(p+1+i)-'a'+10);
else
c[i]=(*(p+1+i)-'0');
}
n3=max(n1,n2);//相加数组的位数为两个数组中大的那个
for(i=n3;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(n1<=0&&n2>0)
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';
else
res[i-1]=tem+'0';
flag=1;
}
else
{
if(tem>=10)
res[i-1]=tem-10+'A';
else
res[i-1]=tem+'0';
flag=0;
}
}
if(flag)//最高位有进位的情况
printf("0X1%s",res);
else
printf("0X%s",res);
return 0;
}