c语言期末综合设计作业,C语言程序设计进阶——期末作业

1字符串循环右移(5分)

题目内容:

输入一个字符串和一个非负整数N,要求将字符串循环右移N次。

输入格式:

输入在第1行中给出一个字符串,以'#'表示结束,‘#’不是字符串的一部分,字符串的长度未知,但至少有一个字符;输入的第2行给出非负整数N。

输出格式:

在一行中输出循环右移N次后的字符串。

输入样例:

Hello World!#

2

输出样例:

d!Hello Worl

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

#include

#include

int main(){

char str[101],ch;

int n ,i,j;

gets(str);

scanf("%d",&n);

int len=strlen(str);

str[len -1] ='\0';

len -=2;

for( i=1;i<=n;i++){

ch =str[len];

for(j=len-1;j>=0;--j)

str[j+1] = str[j];

str[0]=ch;

}

printf("%s",str);

return 0;

}

2.最小包围矩形(5分)

题目内容:

给定一组二维坐标,表示直角坐标系内的一个多边形的连续的顶点的坐标序列。计算能包围这个多边形的平行于坐标轴的最小矩形,输出它的左下角和右上角的坐标。

输入格式:

第一行是一个正整数n表示顶点的数量,第二行是n组整数,依次表示每个顶点坐标的x和y值。

输出格式:

四个整数,依次表示所计算的矩形的左下角的坐标的x、y值和右上角坐标的x、y值。

输入样例:

5

1 1 1 4 3 7 4 4 4 1

输出样例:

1 1 4 7

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

//用我喜爱的大数组做法

#include

int main(){

int n,i;

int arr[101];

scanf("%d",&n);

for(i=0;i

scanf("%d",&arr[i]);

}

int x1,y1,x2,y2;

x1=x2=arr[0];

y1=y2=arr[1];

for(i=2;i

if(x1>arr[i]) x1=arr[i];

if(x2

if(y1>arr[i+1]) y1=arr[i+1];

if(y2

i++;

}

printf("%d %d %d %d",x1,y1,x2,y2);

return 0;

}

//网上找个别人的做法,发现也差不多

#include

#define ARRAY_SIZE 100

struct Point {

int x;

int y;

};

struct Point p[ARRAY_SIZE];

int main(void) {

int i, n;

int min_x, max_x, min_y, max_y;

scanf("%d", &n);

for(i = 0; i < n; ++i)

scanf("%d%d", &p[i].x, &p[i].y);

min_x = max_x = p[0].x;

min_y = max_y = p[0].y;

for(i = 1; i < n; ++i) {

if(min_x > p[i].x)

min_x = p[i].x;

if(max_x < p[i].x)

max_x = p[i].x;

if(min_y > p[i].y)

min_y = p[i].y;

if(max_y < p[i].y)

max_y = p[i].y;

}

printf("%d %d %d %d\n", min_x, min_y, max_x, max_y);

return 0;

}

3大数计算(20分)

题目内容:

很大的数就没办法用int或是long long这样的类型直接计算了,用double则无法保证精度什么的,所以,得自己写程序来算。你的程序要读入两个很大的数,范围在

内,然后你的程序要计算它们的和、差及积并输出。

输入格式:

两行,每行一个数字。

输出格式:

三行,每行一个数字,依次表示输入的数字的和、差及积。

输入样例:

1853244628050278

506996688545785164

输出样例:

508849933173835442

-505143443917734886

939588889486756266731803978475592

时间限制:1000ms内存限制:64000kb

//听说是ACM里面的题,不会做,只能抄叶卡君的代码

#include

#include

void calsum(int *a,int *b,int *ans){

int i;

for(i=0;i<60;i++){

ans[i] += a[i] + b[i];

if(ans[i]>=10){

ans[i]%=10;

ans[i+1]++;

}

}

}

void calmins(int *a,int *b,int *ans){

int i;

for(i=0;i<60;i++){

ans[i] += a[i]-b[i];

while(ans[i]<0){

ans[i+1]--;

ans[i] += 10;

}

}

}

void printans(int *ans,int len){

int flag=0,i;

for(i=len-1;i>=0;i--){

if(ans[i]!=0) flag=1;

if(flag) printf("%d",ans[i]);

}

if(!flag) printf("0");

}

int main(){

char a[60],b[60];

gets(a);

gets(b);

int n1[60]={0},n2[60]={0};

int n1sign=1,n2sign=1; // sing =1 ->表正 0->表负

int n1len=strlen(a), n2len=strlen(b);

if(a[0]=='-') n1sign = 0;

if(b[0]=='-') n2sign = 0;

int i,j;

for(i=n1len-1,j=0; i>=0&&a[i]!='-'; i--,j++) n1[j]=a[i]-'0';

for(i=n2len-1,j=0; i>=0&&b[i]!='-'; i--,j++) n2[j]=b[i]-'0';

int abig=1;

// 负数的时候,数减去前面的负号

if(!n1sign) n1len--;

if(!n2sign) n2len--;

if(n2len>n1len) abig=0;

else if(n1len == n2len){

for(i=n1len;i>=0;i--){

if(n1[i]>n2[i]) break;

else if(n1[i]==n2[i]) continue;

else{

abig=0;break;

}

}

}

// 加法运算

int sum[60]={0};

if(n1sign&&n2sign){

calsum(n1,n2,sum);

printans(sum,60);

}else if(!n1sign&&!n2sign){ // ab 都是负数,绝对值相加,再加负号

printf("-");

calsum(n1,n2,sum);

printans(sum,60);

}else if(n1sign&&abig){

calmins(n1,n2,sum);

printans(sum,60);

}else if(n1sign&&!abig){

calmins(n2,n1,sum);

if(sum[0]!=0) printf("-");

printans(sum,60);

}else if(n2sign&&abig){

calmins(n1,n2,sum);

if(sum[0]!=0) printf("-");

printans(sum,60);

}else{

calmins(n2,n1,sum);

printans(sum,60);

}

printf("\n");

// 减法运算

int mins[60]={0};

if(n1sign&&!n2sign){

calsum(n1,n2,mins);

printans(mins,60);

}else if(!n1sign && n2sign){

printf("-");

calsum(n1,n2,mins);

printans(mins,60);

}else if(n1sign && !abig){

calmins(n2,n1,mins);

if(mins[0]!=0) printf("-");

printans(mins,60);

}else if(!n1sign && abig){

calmins(n1,n2,mins);

if(mins[0]!=0) printf("-");

printans(mins,60);

}else{

calmins(n2,n1,mins);

printans(mins,60);

}

printf("\n");

//乘法运算

int multiply[121]={0};

for(i=0;i<60;i++){

for(j=0;j<60;j++){

multiply[i+j] += n1[i]*n2[j];

while(multiply[i+j] >= 10){

multiply[i+j+1] += multiply[i+j]/10;

multiply[i+j] %= 10;

}

}

}

if((n1sign&&!n2sign)||(!n1sign&&n2sign)) printf("-");

printans(multiply,121);

return 0;

}

4分数比较(10分)

题目内容:

本题要求编写程序,比较两个分数的大小。

输入格式:

输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是int类型范围内的正整数。

输出格式:

在一行中按照“a1/b1关系符a2/b2”的格式输出两个有理数的关系。其中“>”表示“大于”,“

注意在关系符前后各有一个空格。

输入样例:

1/2 3/4

输出样例:

1/2 < 3/4

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

//此题坑啊,第四个测试点总是没过,不是为啥 ( ▼-▼ )

#include

int main(){

long int a1,b1,a2,b2;

scanf("%ld/%ld %ld/%ld",&a1,&b1,&a2,&b2);

//做通分处理

if(b1==1&&b2==1){

printf("1/1 = 1/1");

}else{

int m = a1*b2+b1*b2;

int n = a2*b1+b2*b1;

if(m < n) printf("%ld/%ld < %ld/%ld",a1,b1,a2,b2);

else if(m > n) printf("%ld/%ld > %ld/%ld",a1,b1,a2,b2);

else if(m = n)printf("%ld/%ld = %ld/l%d",a1,b1,a2,b2);

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值